网络通

网络通可以通过下面的curl命令来开启

1
2
3
#!/bin/bash
curl --data "name=<username>&password=<password>&cmd=set&type=9&exp=0" \
http://wlt.ustc.edu.cn/cgi-bin/ip

但是直接将密码包含在命令中,并且公开传输的做法非常危险,可以改为下面的做法,将敏感信息加密

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#!/bin/bash

ERNAME="<username>"
PASSWORD="<password>"

CMD="set"
TYPE="9" # 出口
EXP="3600" # 时间1小时

URL="http://wlt.ustc.edu.cn/cgi-bin/ip"

curl --data-urlencode "name=${USERNAME}" \
--data-urlencode "password=${PASSWORD}" \
--data-urlencode "cmd=${CMD}" \
--data-urlencode "type=${TYPE}" \
--data-urlencode "exp=${EXP}" \
"${URL}"

一个等价的pwsh脚本如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
$USERNAME = "<username>"
$PASSWORD = "<password>"

$CMD = "set"
$TYPE = "9" # 出口
$EXP = "3600" # 时间无限

$URL = "http://wlt.ustc.edu.cn/cgi-bin/ip"

curl --data-urlencode "name=$USERNAME" `
--data-urlencode "password=$PASSWORD" `
--data-urlencode "cmd=$CMD" `
--data-urlencode "type=$TYPE" `
--data-urlencode "exp=$EXP" `
$URL

这里的做法其实还是不够安全,因为账号和密码都被硬编码在脚本中。 可以将用户名和密码等敏感信息拆分到单独的json文件中,在脚本中自行读取

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
param (
[string]$config = "$HOME/.config/wlt/wlt-config.json"
)

# Expand ~ to full path if necessary
$config = $config -replace "^~", $HOME

if (-not (Test-Path $config)) {
Write-Error "The config file does not exist: $config"
exit 1
}

# Read username and password from JSON config
try {
$configContent = Get-Content -Path $config -Raw | ConvertFrom-Json
$USERNAME = $configContent.username
$PASSWORD = $configContent.password
} catch {
Write-Error "Failed to parse JSON config. Please check the format."
exit 1
}

if (-not $USERNAME -or -not $PASSWORD) {
Write-Error "Missing 'username' or 'password' field in the config file."
exit 1
}

# Fixed parameters
$CMD = "set"
$TYPE = "9" # outbound
$EXP = "0" # unlimited time
$URL = "http://wlt.ustc.edu.cn/cgi-bin/ip"

# Send request
curl --data-urlencode "name=$USERNAME" `
--data-urlencode "password=$PASSWORD" `
--data-urlencode "cmd=$CMD" `
--data-urlencode "type=$TYPE" `
--data-urlencode "exp=$EXP" `
$URL | Out-Null

其中配置文件形如

1
2
3
4
{
"username": "xxxx",
"password": "yyyyyyy"
}

这些登陆脚本可以完全替代使用浏览器的过程,具体细节参考LUG的网络通脚本介绍

在几个服务器中实际部署了如下wlt脚本,需要手动输入用户名和密码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
#!/usr/bin/env python3

import subprocess
import getpass
import re
import sys

def login_and_fetch_html() -> str:
"""
提示用户输入用户名和密码,通过 curl 登录,返回 HTML 内容(已解码为 UTF-8)。
"""
username = input("请输入用户名: ")
password = getpass.getpass("请输入密码: ")

url = "http://wlt.ustc.edu.cn/cgi-bin/ip"
post_data = f"cmd=set&name={username}&password={password}&type=9&exp=0"

try:
result = subprocess.run(
["curl", "-s", "-d", post_data, url],
stdout=subprocess.PIPE,
stderr=subprocess.PIPE,
check=True
)
html_bytes = result.stdout
except subprocess.CalledProcessError as e:
print("网络请求失败:", e.stderr.decode("utf-8", errors="ignore"))
sys.exit(1)

return html_bytes.decode("gb2312", errors="ignore")


def extract_body_from_html(html: str) -> bool:
"""
从 HTML 中提取 <body> 内容,并判断是否包含“成功”等关键字。
返回 True 表示成功,False 表示失败。
"""
match = re.search(r"<body.*?>.*?</body>", html, re.DOTALL | re.IGNORECASE)
if not match:
return False
body = match.group(0)

# 可以根据页面中的实际提示词调整关键字
success_keywords = ["成功", "成功连接", "登录成功", "连接已建立"]
return any(keyword in body for keyword in success_keywords)


def main():
html = login_and_fetch_html()
if extract_body_from_html(html):
print("登录成功")
else:
print("登录失败")


if __name__ == "__main__":
main()

个人主页

直接在Windows的文件浏览器路径栏输入ftp://home.ustc.edu.cn, 输入登录名和密码,登录名是邮件帐号@之前的部分,密码与邮件系统一样。

希望对外提供个人主页服务时,必须先创建子目录public_html/, 这个目录里的所有文件均可以通过http://home.ustc.edu.cn/~YourID来访问。在public_html/中存放index.html文件就可以提供默认首页,希望访问其它网页时,在URL中加上相对路径即可。

USTC LaTeX / Overleaf

USTC LaTeX 是支持在线使用的LaTeX平台,基于Overelaf开源版进行的开发,直接支持通过Git仓库同步的功能。 使用Git仓库时,我们可以利用本地的代码编辑器,这比使用浏览器上的编辑器要方便得多,因此记录一下对应的做法。

首先,从网站获取Git仓库链接,通常形如https://latex.ustc.edu.cn/git/xxxxxxx.git,主分支名称为master(这个似乎不可以修改)。 然后将其克隆到本地,并且重新取一个仓库名,例如

1
git clone https://latex.ustc.edu.cn/git/xxxxxxx.git latex_test

由于项目的文件在平台上随时有可能被更改,在本地仓库对代码进行修改之后,远程推送很可能会出现推送失败的情况,对应的处理措施如下:

  • 第一步,我们需要使用其它分支指向本地仓库的最新版本(确保本地的修改不会丢失)
  • 第二步,执行如下命令,确保本地仓库与远程仓库的主分支最新版本保持一致
1
2
3
git fetch --all
git reset --hard origin/master
git pull
  • 第三步,在本地尝试合并分支,然后重新推送

由于平台提供的是HTTPS协议URL,我们在远程操作时需要提供USTC LaTeX平台的用户名和密码, 可以使用下面的命令选择将身份验证信息保存到本地

1
git config credential.helper store

在配置完成后,我们可能需要再执行一次远程操作并输入身份验证信息,Git会将其保存到~/.git-credentials文件中,在下一次远程操作时自动应用。

如果希望改变凭证的存储位置,也可以使用下面的命令将其存储到本地仓库中(显然还需要通过.gitignore将其忽略)

1
git config credential.helper 'store --file=.git-credentials'

注意:

  • 平台的Git仓库不支持force pushforce pull
  • 只提供https协议的仓库链接,不提供ssh协议的仓库链接;
  • 不建议将多个分支推送到远程仓库,因为平台上无法切换Git分支,只会显示主分支的版本;
  • 平台对于通过Git仓库上传的以.开头的隐藏文件有安全隔离措施(允许通过Git仓库上传,但是在平台上无法查看和使用其内容,只允许下载),在平台上直接创建的隐藏文件是可以查看的,但是一旦通过Git仓库修改,也会被隔离。
  • 有时我们需要改变对这种特殊仓库推送时使用的用户名和邮箱,直接修改仓库内的配置文件即可。
  • 对于Overleaf的git功能操作也是类似的,不过它会直接生成一个token用于登录,而且免费账户不提供git服务。

最近测试发现,USTC LaTeX 对于Git的支持还是有问题,虽然通过Git成功推送到远程仓库,但是在平台上完全没有看到内容的更新。