本文提供了一个用于无图形界面linux系统自动连接dlut-lingshui校园网的shell脚本,并提供了设置开机联网以及断网重连的详细操作步骤。本文的操作在ubuntu 22.04系统上验证有效,在其他版本的linux系统上操作时遇到问题可以自行百度。
1. 获取校园网认证界面的用户名和密码
校园网认证账号是自己的学号,认证密码是加密后的256位密文,这个密文存储在浏览器cookie中,我们可以通过电脑图形界面辅助获取。
1.1 获取密码步骤(以谷歌浏览器为例)
- 打开浏览器,按“F12”进入开发者工具
- 地址栏输入“http://auth.dlut.edu.cn/eportal/InterFace.do?method=getOnlineUserInfo”并回车(这个网址并不唯一,总之能访问到和校园网登录沾边的页面就行)
- 依次在开发者工具中点击“网络”,“Interface…method=getOnlineUserInfo”,“Headers”
- 在“Cookie”一栏中找到储存的密码(密码以密文的形式存储)
2. 将账号密码填入shell脚本并保存
将下面这段代码中的账号密码替换为你自己的,并记住保存的路径。本文保存的路径为
/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}" ]; then
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}")
# echo "${auth_result}"
fi
}
for ((i=0; i<5; i++)) #5次获取code,获取失败说明网络不通
do
code=$(curl -I ${captive_server} -s | grep "HTTP/1.1" | awk '{print $2}')
if [ -z "${code}" ]; then
sleep 2s
else
break
fi
done
if [ -z "${code}" ]; then
echo 连接失败,请检查:$'\n'1. 校园网是否正常/是否插好网线$'\n'2. 电脑代理是否正确设置(可以尝试关闭代理)
exit 1;
fi
for ((i=0; i<5; i++)) #5次连接校园网,连接失败说明账号密码不对或此脚本已失效
do
if [ "${code}" = "200" ]; then
echo 第${i}次尝试连接
login ${id} ${passwd}
elif [ "${code}" = "204" ]; then
echo 连接成功
exit 0;
fi
sleep 2s
code=$(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: 密码加密后的密文和设备硬件属性有关吗?
A: 不同设备获取到的密文不同,密文应该和硬件属性有关,最好在自己设备的图形界面获取密文。(换设备好像也没什么问题)
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的使用方法