1 写在前面
本文章改写自《shell脚本登录dlut-lingshui并设置开机连网和断网重连》,旨在利用其脚本解决无图形界面情况下的校园网登录以及断网重连问题。本文仅作使用脚本的示范而不分析原理,若对脚本细节感兴趣可以查阅原文。
2 操作步骤
2.1 修改代码并保存到目标机器
首先,将下面这段python代码保存为以 .py 为后缀的文件(例如 a.py ),替换你的账号与密码后拷贝到目标机器上。
import math
import requests
id = '替换为你的账号!!!'
password = '替换为你的密码!!!'
bash_file = ['#!/bin/bash\n', "captive_server='http://www.google.cn/generate_204'\n", "url_index='http://123.123.123.123/'\n", "user_agent='Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36'\n", 'id="这里输入账号"\n', 'passwd="这里输入密文"\n', 'login() {\n', ' login_page_url=$(curl -s "${url_index}" | grep -o \'<script>[^<]*</script>\' | sed -e "s/<script>\\(.*\\)<\\/script>/\\1/" | grep -o "\'.*\'" | sed -e "s/\'//g")\n', " login_url=$(echo ${login_page_url} | awk -F \\? '{print $1}')\n", ' login_url="${login_url/index.jsp/InterFace.do?method=login}"\n', " query_string=$(echo ${login_page_url} | awk -F \\? '{print $2}')\n", ' query_string="${query_string//&/%26}"\n', ' query_string="${query_string//=/%3D}"\n', ' login_post_data="userId=$1&password=$2&service=&queryString=${query_string}&operatorPwd=&operatorUserId=&validcode=&passwordEncrypt=true"\n', ' if [ -n "${login_url}" ]; then\n', ' auth_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}")\n', ' # echo "${auth_result}"\n', ' fi\n', '}\n', 'for ((i=0; i<5; i++)) #5次获取code,获取失败说明网络不通\n', 'do\n', ' code=$(curl -I ${captive_server} -s | grep "HTTP/1.1" | awk \'{print $2}\')\n', ' if [ -z "${code}" ]; then\n', ' sleep 2s\n', ' else\n', ' break\n', ' fi\n', 'done\n', 'if [ -z "${code}" ]; then\n', " echo 连接失败,请检查:$'\\n'1. 校园网是否正常/是否插好网线$'\\n'2. 电脑代理是否正确设置(可以尝试关闭代理)\n", ' exit 1;\n', 'fi\n', 'for ((i=0; i<5; i++)) #5次连接校园网,连接失败说明账号密码不对或此脚本已失效\n', 'do\n', ' if [ "${code}" = "200" ]; then\n', ' echo 第${i}次尝试连接\n', ' login ${id} ${passwd}\n', ' elif [ "${code}" = "204" ]; then\n', ' echo 连接成功\n', ' exit 0;\n', ' fi\n', ' sleep 2s\n', ' code=$(curl -I ${captive_server} -s | grep "HTTP/1.1" | awk \'{print $2}\')\n', 'done\n', 'echo 连接失败,请检查用户信息是否正确\n']
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]
print(mac)
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())
bash_file[4] = 'id=\"' + id + '\"\n'
bash_file[5] = 'passwd=\"' + str(crypted_data.hex()) + '\"\n'
s = ''.join(bash_file)
with open('connect.sh', 'w', encoding='utf-8') as file:
file.write(s)
2.2 生成bash脚本
在目标机器命令行运行刚才拷贝过来的python脚本:
python3 a.py
运行成功后,python脚本会在其所在目录下生成一个名为 “connect.sh” 的bash脚本。如果python脚本报错或没反应(基本都是网络连接不稳定造成的),可以试着多运行几次。
注意:很多linux系统自带python3(例如ubuntu22.04-server),因此可以直接运行该python文件。如果你的linux不带python,请你想办法安装python3.
2.3 为生成的bash脚本赋予权限并运行
chmod +x connect.sh
bash connect.sh
至此,你应该已经连接到校园网了。
注意:python脚本中存储着密码明文,在公用服务器等机器上存储非常不安全。如果已经确认生成的bash脚本没有问题,请尽快删除python脚本!
2.4 (可选)设置开机自动联网&断网自动重连
本文借助crontab工具实现开机自动联网和断网自动重连,crontab的用法可以自行百度。
以下是配置过程:
- 安装curl(需要互联网)
sudo apt install curl
- 命令行输入crontab -e,向打开的文件追加以下两行(注意修改路径)并保存
@reboot export PATH=/usr/bin:/bin:/usr/local/bin && /home/ubuntu/my_tools/connect.sh
*/10 * * * * export PATH=/usr/bin:/bin:/usr/local/bin && /home/ubuntu/my_tools/connect.sh
第一行代表开机时运行一次脚本(开机启动)
第二行代表每隔十分钟运行一次脚本(每十分钟检查网络,断网重连)
3 误删了connect.sh怎么办?
校园网一旦连接成功,python脚本就会失效。想要重新生成connect.sh文件,我们可以在“i大工”APP中把这台设备踢下线,然后再运行python脚本。