1. 项目概述
作为一名在桂林电子科技大学就读的学生,我经常遇到校园网频繁掉线需要重新登录的问题。特别是在使用Ubuntu系统时,每次断网后都要手动打开浏览器输入账号密码,非常影响学习和工作效率。经过多次尝试,我开发了一套完整的校园网自动登录解决方案,现在将详细实现过程分享给大家。
这个方案的核心是一个Python脚本,它能够自动检测网络状态并在需要时完成认证。相比网上常见的简单脚本,我的版本增加了双重验证机制和详细的日志记录,确保登录过程更加可靠。整个方案在Ubuntu 22.04 LTS上测试通过,理论上也适用于其他Linux发行版。
2. 环境准备与依赖安装
2.1 系统要求检查
在开始之前,请确保你的Ubuntu系统满足以下基本要求:
- 已安装Python 3.6或更高版本(Ubuntu 20.04/22.04默认已安装)
- 拥有sudo权限的账户
- 已正确配置有线网络连接
可以通过以下命令检查Python版本:
bash复制python3 --version
2.2 安装必要依赖
脚本运行需要requests和netifaces两个Python库。requests用于处理HTTP请求,netifaces用于获取网络接口信息。安装命令如下:
bash复制sudo apt update
sudo apt install python3-pip
pip3 install requests netifaces
注意:如果使用校园网环境安装依赖,可能需要先通过浏览器完成认证后再执行上述命令。若遇到速度慢的问题,可以临时使用国内镜像源:
bash复制pip3 install -i https://pypi.tuna.tsinghua.edu.cn/simple requests netifaces
3. 脚本配置与部署
3.1 获取并编辑脚本
将提供的Python脚本保存为guet_auto_login.py,建议存放在/opt/guet_network目录下(需要先创建该目录):
bash复制sudo mkdir -p /opt/guet_network
sudo nano /opt/guet_network/guet_auto_login.py
然后将脚本内容粘贴进去,特别注意以下配置项的修改:
python复制# ========== 配置区域 ==========
USERNAME = '你的学号' # 不带运营商后缀
PASSWORD = '你的密码'
INTERFACE = 'enp42s0' # 通过ifconfig命令查看你的网卡名称
AUTH_SERVER = '10.0.1.5' # 认证服务器IP(通常不需要修改)
OPERATOR_SUFFIX = "@telecom" # 根据你的运营商选择
# =============================
3.2 确定网络接口名称
获取正确的网络接口名称非常关键。使用以下命令查看:
bash复制ifconfig -a
有线网卡通常以enp或eth开头,无线网卡以wlp开头。选择你正在使用的接口名称填入脚本。
4. 日志系统配置
4.1 创建日志文件
为了便于排查问题,我们设置一个专门的日志文件:
bash复制sudo touch /var/log/guet_auto_login.log
sudo chmod 666 /var/log/guet_auto_login.log
4.2 测试脚本运行
首次运行脚本验证配置是否正确:
bash复制python3 /opt/guet_network/guet_auto_login.py
查看日志输出确认是否登录成功:
bash复制cat /var/log/guet_auto_login.log
正常输出应类似于:
code复制[2024-03-15 14:30:45] 开始检查网络状态...
[2024-03-15 14:30:46] 网络未连接或需要认证,尝试登录...
[2024-03-15 14:30:46] 登录请求URL: http://10.0.1.5/drcom/login?callback=dr1004&DDDDD=你的学号...
[2024-03-15 14:30:47] 登录响应:{"result":1,"msg":"认证成功"...
[2024-03-15 14:30:48] 二次验证通过,确认在线
5. 自动化部署
5.1 设置定时任务
使用cron设置每6小时自动运行一次脚本:
bash复制crontab -e
在文件末尾添加(注意替换为你的实际路径):
bash复制0 */6 * * * /usr/bin/python3 /opt/guet_network/guet_auto_login.py >> /var/log/guet_auto_login.log 2>&1
保存退出后,cron会自动加载新配置。可以通过以下命令查看已设置的定时任务:
bash复制crontab -l
5.2 配置开机自启
为了让脚本在系统启动时自动运行,我们需要创建一个systemd服务:
- 创建服务文件:
bash复制sudo nano /etc/systemd/system/guet_auto_login.service
- 添加以下内容:
ini复制[Unit]
Description=GUET Campus Network Auto Login
After=network.target
[Service]
ExecStart=/usr/bin/python3 /opt/guet_network/guet_auto_login.py
Restart=on-failure
User=root
[Install]
WantedBy=multi-user.target
- 启用并启动服务:
bash复制sudo systemctl daemon-reload
sudo systemctl enable guet_auto_login.service
sudo systemctl start guet_auto_login.service
检查服务状态:
bash复制sudo systemctl status guet_auto_login.service
6. 高级配置与故障排除
6.1 多运营商支持
脚本默认支持以下运营商后缀:
- "" - 校园网(无后缀)
- "@telecom" - 电信
- "@unicom" - 联通
- "@cmcc" - 移动
- "@cbn" - 广电
只需修改OPERATOR_SUFFIX变量即可切换运营商。
6.2 常见问题解决
-
登录失败,提示密码错误
- 确认密码是否正确,特别是特殊字符
- 尝试在浏览器中手动登录确认账号状态
-
脚本运行但网络未连接
- 检查
INTERFACE配置是否正确 - 确认认证服务器IP
AUTH_SERVER是否需要更新 - 查看完整日志:
cat /var/log/guet_auto_login.log
- 检查
-
定时任务未执行
- 检查cron服务是否运行:
sudo service cron status - 查看cron日志:
grep CRON /var/log/syslog
- 检查cron服务是否运行:
-
开机自启无效
- 检查服务状态:
systemctl status guet_auto_login.service - 查看日志:
journalctl -u guet_auto_login.service -b
- 检查服务状态:
6.3 脚本优化建议
-
密码加密存储
目前脚本中密码是明文存储的,安全性较低。可以考虑:- 使用keyring库存储密码
- 或将密码存储在单独配置文件中并设置权限
-
网络状态检测优化
可以增加更多检测方式,如ping测试、特定端口检测等 -
多网卡支持
对于使用多网卡的环境,可以增加自动选择网卡的逻辑
7. 实现原理深度解析
7.1 认证流程分析
桂林电子科技大学校园网采用DRCOM认证系统,其核心流程包括:
- 客户端向认证服务器(10.0.1.5)发送GET请求
- 请求包含学号、密码、IP等参数
- 服务器返回JSON格式的响应
- 认证成功后客户端可以访问外网
我们的脚本模拟了浏览器完整的认证过程,包括:
- 构造正确的请求URL和参数
- 处理服务器响应
- 二次验证确保真正联网
7.2 双重验证机制
脚本采用两种方式验证网络状态:
-
认证服务器状态接口
- 访问
/drcom/chkstatus接口 - 解析返回的JSON数据
- 检查result字段是否为1
- 访问
-
外部网站测试
- 尝试访问百度等公网网站
- 检查是否被重定向到认证页面
- 确认返回状态码为200
这种双重验证确保了网络状态的准确性,避免了"假在线"情况。
7.3 定时任务设计
选择每6小时运行一次是基于以下考虑:
- 校园网会话通常12-24小时过期
- 提前续期避免断网
- 平衡系统负载和及时性
可以根据实际需要调整cron表达式,例如:
0 */4 * * *- 每4小时*/30 * * * *- 每30分钟(不推荐过于频繁)
8. 安全注意事项
-
脚本权限管理
- 确保脚本只有所有者可写:
chmod 744 /opt/guet_network/guet_auto_login.py - 日志文件设置为仅追加:
chattr +a /var/log/guet_auto_login.log
- 确保脚本只有所有者可写:
-
密码安全
- 不要在公共电脑上使用此脚本
- 定期更改密码
- 考虑使用单独的校园网账号
-
网络使用规范
- 遵守学校网络使用规定
- 不要用于高带宽消耗或违规用途
- 注意账号共享风险
这套自动登录系统我已经稳定使用了一个学期,基本解决了校园网频繁掉线需要手动登录的问题。特别是在跑长时间任务或者远程连接时,不再担心因为网络断开而导致工作中断。对于开发者来说,还可以考虑将脚本进一步封装为系统托盘应用,或者增加GUI配置界面,这些我都会在后续版本中逐步实现。