本文提供了一个用于无图形界面linux系统自动连接dlut-lingshui校园网的shell脚本,并提供了设置开机联网以及断网重连的详细操作步骤。本文的操作在ubuntu 22.04系统上验证有效,在其他版本的linux系统上操作时遇到问题可以自行百度。
1. 获取校园网认证界面的用户名和密码
校园网认证账号是自己的学号,认证密码是加密后的256位密文,我们可以通过运行下面的python脚本获取密文。
1.1 获取密码步骤
在未联网(如果已联网请先下线)的机器上,将下面这段python代码中的password替换为你自己的密码明文,保存运行后得到密文。
import math
import requestspassword = '你的密码明文'
e = '010001'
m = '94dd2a8675fb779e6b9f7103698634cd400f27a154afa67af6166a43fc26417222a79506d34cacc7641946abda1785b7acf9910ad6a0978c91ec84d40b71d2891379af19ffb333e7517e390bd26ac312fe940c340466b4a5d4af1d65c3b5944078f96a1a51a5a53e4bc302818b7c9f63c4a1b07bd7d874cef1c3d4b2f5eb7871'
url_index = 'http://123.123.123.123/'
user_agent = 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36'm = int.from_bytes(bytearray.fromhex(m), byteorder='big')
e = int.from_bytes(bytearray.fromhex(e), byteorder='big')
login_page_url = requests.get(url_index).text.split('\'')[1]
query_string = login_page_url.split('?')[1]query_list = query_string.split('&')
for i in query_list:query_item = i.split('=')if query_item[0] == 'mac':mac = query_item[1]plaintext = password + '>' + mac
plaintext = plaintext.encode('utf-8')input_nr = int.from_bytes(plaintext, byteorder='big')
crypted_nr = pow(input_nr, e, m)
keylength = math.ceil(m.bit_length() / 8)
crypted_data = crypted_nr.to_bytes(keylength, byteorder='big')
print(crypted_data.hex())
2. 将账号密码填入shell脚本并保存
将下面这段bash代码中的账号密码替换为你自己的学号和密码密文后保存,并记住保存的路径。
本文保存的路径如下,请把后文中所有出现的此路径替换为你自己的路径
/home/ubuntun/system_script/dlut_network.sh
#!/bin/bash
captive_server='http://www.google.cn/generate_204'
url_index='http://123.123.123.123/'
user_agent='Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36'id="这里输入账号"
passwd="这里输入密文"login() {login_page_url=$(curl -s "${url_index}" | grep -o '<script>[^<]*</script>' | sed -e "s/<script>\(.*\)<\/script>/\1/" | grep -o "'.*'" | sed -e "s/'//g")login_url=$(echo ${login_page_url} | awk -F \? '{print $1}')login_url="${login_url/index.jsp/InterFace.do?method=login}"query_string=$(echo ${login_page_url} | awk -F \? '{print $2}')query_string="${query_string//&/%26}"query_string="${query_string//=/%3D}"login_post_data="userId=$1&password=$2&service=&queryString=${query_string}&operatorPwd=&operatorUserId=&validcode=&passwordEncrypt=true"if [ -n "${login_url}" ]; thenauth_result=$(curl -d "${login_post_data}" -H "Accept: */*" -H "Accept-Encoding: gzip, deflate" -H "Accept-Language: zh-CN,zh\;q=0.9" -H "Proxy-Connection: keep-alive" -H "Referer: ${login_url}" -H "User-Agent: ${user_agent}" "${login_url}")# echo "${auth_result}"fi
}for ((i=0; i<5; i++)) #5次获取code,获取失败说明网络不通
docode=$(curl -I ${captive_server} -s | grep "HTTP/1.1" | awk '{print $2}')if [ -z "${code}" ]; thensleep 2selsebreakfi
done
if [ -z "${code}" ]; thenecho 连接失败,请检查:$'\n'1. 校园网是否正常/是否插好网线$'\n'2. 电脑代理是否正确设置(可以尝试关闭代理)exit 1;
fi
for ((i=0; i<5; i++)) #5次连接校园网,连接失败说明账号密码不对或此脚本已失效
doif [ "${code}" = "200" ]; thenecho 第${i}次尝试连接login ${id} ${passwd}elif [ "${code}" = "204" ]; thenecho 连接成功exit 0;fisleep 2scode=$(curl -I ${captive_server} -s | grep "HTTP/1.1" | awk '{print $2}')
done
echo 连接失败,请检查用户信息是否正确
3. 为脚本赋予权限
chmod +x /home/ubuntun/system_script/dlut_network.sh
4. 设置开机自动联网&断网自动重连
本文借助crontab工具实现开机自动联网和断网自动重连,crontab的用法可以自行百度。
以下是配置过程:
- 安装curl(需要连网才能安装)
sudo apt install curl
- 命令行输入crontab -e,向打开的文件追加以下两行(注意修改路径)并保存
@reboot export PATH=/usr/bin:/bin:/usr/local/bin && /home/ubuntun/system_script/dlut_network.sh
*/10 * * * * export PATH=/usr/bin:/bin:/usr/local/bin && /home/ubuntun/system_script/dlut_network.sh
第一行代表开机时运行一次脚本(开机启动)
第二行代表每隔十分钟运行一次脚本(每十分钟检查网络,断网重连)
Q&A:
Q: python脚本中的e和m是怎么获得的,需要修改吗?
A: 这两个变量是rsa加密需要的,一般不需要修改。如果脚本失效,可以尝试通过开发者工具获取认证界面信息(method=pageInfo)
Q: 设置了crontab后脚本依然不生效,我该如何调试?
A: 可以从以下几个方面逐一排查:
- 检查cron服务是否正常
service cron status
- 检查脚本权限设置是否正常
- 将程序运行的输出信息保存在日志中进一步分析。
要把程序返回信息输出到某个文件中,只需在crontab的计划任务后面追加>> /path/to/your/logfile.log 2>&1
,例如:
@reboot export PATH=/usr/bin:/bin:/usr/local/bin && /home/ubuntun/system_script/dlut_network.sh >> /home/ubuntun/system_script/aaa.log 2>&1
*/10 * * * * export PATH=/usr/bin:/bin:/usr/local/bin && /home/ubuntun/system_script/dlut_network.sh >> /home/ubuntun/system_script/bbb.log 2>&1
Q: 为什么我可以使用curl,但脚本日志输出却提示我curl不存在?
A: 如果你使用了anaconda或其他虚拟环境管理器,并默认激活了base环境,那你使用的curl很有可能是虚拟环境中的,这种情况下有两种解决办法。
一种解决方法 是使用which curl查看当前curl的路径,并export这个路径:
crontab -e
#在PATH后添加这个路径,用冒号分隔
*/10 * * * * export PATH=/usr/bin:/bin:/usr/local/bin:/home/ubuntun/anaconda3/bin && /home/ubuntun/system_script/dlut_network.sh >> /home/ubuntun/system_script/bbb.log 2>&1
(推荐)另一种解决方法 是在系统安装curl(会自动安装在/usr/bin路径下):
sudo apt install curl
Q: */10 * * * * 是什么意思?
A: 请自行百度crontab的使用方法