OpenWrt / ImmortalWrt 路由器上的校园网门户自动认证脚本(绍兴大学 USX · Dr.COM eportal 已配好,开箱可用)。
一句话:让路由器自己保持校园网门户登录,宿舍里所有设备共享一个名额;掉线后最迟 5 分钟自动补一次登录,不需要人管。
不是电脑或手机上的软件,也不是 LuCI 插件(没有网页界面)。它只有两个文件, 放进路由器的
/etc/,挂一条 cron 就完事。
先对照这一节,不满足就别往下装。
| 项目 | 要求 | 怎么确认 |
|---|---|---|
| 路由器固件 | 已刷 OpenWrt / ImmortalWrt(或基于 OpenWrt 的第三方固件)。作者这台:ImmortalWrt 25.12.2 + CMCC RAX3000Me(eMMC 版) | SSH 进去看开机横幅;原厂固件(小米/移动/华为自带的那套)跑不了 |
| 包管理器 | apk(OpenWrt 24.10+ / ImmortalWrt 25.x)或 opkg(旧版) |
SSH 进去敲 apk --version,报 not found 就改敲 opkg --version,有一个能出版本号就行 |
| 必装的两个包 | curl、ca-certificates |
apk add curl ca-certificates 能装上 |
| 脚本自身依赖 | 只要 /bin/sh + busybox 自带的 ip awk sed grep cut head date sleep logger,外装一个 curl |
不需要 bash、不需要 python,所以不挑型号 |
| 网络拓扑 | 宿舍那根校园网线插路由器 WAN 口,且 WAN 能从门户 DHCP 拿到 172.19.x.x |
路由器上看 wan 接口有没有 172.19 地址 |
| 门户账号 | 你自己的学号 + 门户密码。Dr.COM 把运营商编码在账号后缀:@telecom=电信、@cmcc=移动 |
浏览器能手动登录成功即可 |
| 操作端电脑 | 一台能 SSH / scp 进路由器的电脑(Windows 10+ 自带 OpenSSH,macOS、Linux 同理) | PowerShell 里 ssh root@路由器地址 能进去 |
| 名额 | 学校限 2 台设备;路由器 NAT 后全部下游合计算 1 台 | 自助页能看到那台设备 |
这几种情况用不了,别试:
- 路由器是原厂固件、或只能用网页后台设置(没刷过 OpenWrt)
- 学校门户靠 Cookie 会话 / JS 算签名(老式
0.htm+DDDDD、锐捷InterFace.do加密串等)—— 本脚本只会原样重放一条静态请求,不会算签名 - 想在 Windows 电脑上自动登录共享给别的设备 —— 那不是这个仓库的东西(这里只让路由器自己登录)
- 光猫直连、或校园网本身是 PPPoE 拨号(那是另一套认证,参数不一样)
campus_auth.sh—— 主脚本presets/usx-drcom.conf.example—— 本校配置模板
先在能上网的设备上存好(路由器本身此刻还没网,没法自己下载)。
【电脑】 PowerShell(把路径换成你下载的位置):
scp campus_auth.sh root@192.168.10.1:/etc/campus_auth.sh
scp presets/usx-drcom.conf.example root@192.168.10.1:/etc/campus_auth.conf
192.168.10.1换成你自己路由器的管理地址(OpenWrt 默认多为192.168.1.1)。 不知道就电脑上按Win→ 输入cmd回车 →ipconfig→ 看"默认网关"那一行。 后面所有出现192.168.10.1的地方同理。
【终端】SSH 进路由器(电脑上按 Win → 输入 powershell 回车,然后):
ssh root@192.168.10.1
第一次会问 Are you sure you want to continue connecting → 输 yes 回车;
再问密码就直接回车(默认 root 无密码),或输你设过的 root 密码。
看到提示符变成 root@OpenWrt:~# 就说明已经在路由器里了,下面这些命令都粘到这个窗口:
apk add curl ca-certificates
chmod 700 /etc/campus_auth.sh
chmod 600 /etc/campus_auth.conf老版本 OpenWrt 把
apk换成opkg update && opkg install curl ca-certificates。
vi /etc/campus_auth.conf只改这两行,别的一个字都别动:
USER_ACCOUNT="你的学号@telecom" # @telecom=电信,@cmcc=移动,跟你登录页选的一致
USER_PASSWORD="你的门户密码"然后:
/etc/campus_auth.sh --show-config # 先看请求拼对了没,不发出去
/etc/campus_auth.sh -v # 真跑一次响应: 里出现 已经成功登录 或 successlogin 就是成了。再验一下网:
curl -s -o /dev/null -w '%{http_code}\n' -m 8 https://www.baidu.com出 200 = 通。最后交给定时器:
echo '0,5,10,15,20,25,30,35,40,45,50,55 * * * * /etc/campus_auth.sh >/dev/null 2>&1' >> /etc/crontabs/root
/etc/init.d/cron restart装完甩手,以后它自己管。想确认跑得好不好、掉线了怎么查(都在路由器上敲):
tail -20 /etc/campus_auth.log # 持久日志,重启也不丢(logread 重启会清空)
cat /tmp/campus_auth.state # 当前在线状态:up / down- 用
presets/usx-drcom.conf.example的话,持久日志默认就开着(LOG_FILE已设);自己配的话把LOG_FILE设成这个路径。 - 一直
up、日志里只有掉线那一下的记录 = 正常在干活。 - 脚本每 6 小时还会兜底强制认证一次(幂等),专门防「探针误判——你以为还连着、其实已断网」。
- 手动救急:
rm -f /tmp/campus_auth.force(删掉它,下次 cron 就跑一次)。
| 现象 | 怎么办 |
|---|---|
ERROR: 找不到 curl |
上面第 2 步的 apk add 没执行 |
取不到校园网内网 IP |
WAN 没拿到 172.19.x.x,检查网线插的是不是 WAN 口 |
| 日志说失败,可 https curl 出 200 | 只是日志措辞,功能正常,不用管 |
| 装完能上,过一阵就断、且反复 | 学校那边有对抗手段,脚本解决不了 |
刷机/升级固件会清掉这些文件,所以顺手加进保留列表:
for f in /etc/campus_auth.sh /etc/campus_auth.conf /etc/crontabs/root; do echo $f >> /etc/sysupgrade.conf; done脚本本体和学校无关,要改的都在配置文件里。照着
campus_auth.conf.example 的注释,把浏览器 F12 抓到的那条登录请求
拆成 SERVER / PORT / AUTH_PATH / AUTH_QUERY 四段填进去即可;
账号里的 %2C0%2C 前缀和 @telecom 后缀是本校专属,别照抄。
配置文件里是你的明文密码:保持 600,别提交到 Git,别截图发群。
脚本自己打印日志时已经把密码位置换成 ****。
MIT,见 LICENSE。
本项目仅为技术分享与学习,其余用途后果自负。