本脚本实现了锐捷 ePortal Web 认证的登录,需要 curl 指令的支持,通过 curl 发送认证所需的 POST 数据包来实现 Web 认证。
如果你所在的学校也是使用锐捷进行校园网认证,并且开启了 Web 的认证方式(如下图),那么应该是可以使用本脚本进行认证的。
项目中的脚本文件以 _jmu 结尾命名的仅适用于集美大学,其他学校请使用 _general 结尾命名的脚本文件。
欢迎大家发起 Pull request 提交各自学校的认证脚本!
脚本依赖于 curl,所以请确保系统已经安装了 curl。
这个 Shell script 主要工作原理如下:
- 向 Captive Portal Server 发送 GET 请求,检查返回的 HTTP 状态码是否为 204:
- 如果为 204 则说明当前已经能正常联网,退出脚本,停止后续认证流程;
- 如果不是 204 则说明当前未进行锐捷认证(一般来说,在未认证的情况下请求任意页面,认证服务器都会返回一个 HTTP 302 或者 301 状态码,用于将你重定向到 ePortal 认证页面),则将 HTTP 重定向所转向的页面的 URL 作为认证页面 URL。
- 构造进行锐捷 ePortal 认证所需的 HTTP 请求,并通过 curl 发送该请求。
- 认证成功。
./ruijie_general.sh username password
- username参数为认证用户名。
- password参数为认证密码。
这里主要介绍一下如何借助 Openwrt / LEDE 里的 cron 定时任务实现路由器每天定时自动进行锐捷认证。
其实这也是我当初写这个脚本的主要目的,就是想着每天早上断网结束之后,路由器能自动帮我锐捷认证上,然后我睡醒了就能直接上网了。
以下均使用刷了 LEDE Reboot 17.01.4 的 Netgear WNDR3800 作为演示,我 Luci 的语言设置为了中文,使用英文的只要照着相对应的方法操作就行。
首先通过 ssh 连接到路由器。然后执行以下指令,安装 curl:
opkg update
opkg install curl
上传脚本,我这里直接:
vi /usr/bin/ruijie.sh
然后按 I 进入 Insert 模式,把代码粘贴进去。之后按 ESC 退出 Insert 模式,输入 :wq 并按下回车保存文件并退出 vi。 之后给脚本赋予执行权限:
chmod +x /usr/bin/ruijie.sh
这里也可以通过 SCP 把文件直接上传到相应位置,然后赋予执行权限。SCP 上传文件的方法这里不再详细说明,看哪种方法对你来说比较方便就用哪种,总之,只要能顺利把脚本文件上传到路由器中,并赋予正确的执行权限即可。
Openwrt / LEDE 默认的时区是 UTC,这里为了下面配置 crontab 中设置时间方便,以及让路由器的时间能跟北京时间同步。需要将时区改成 Asia/Shanghai。
打开并登陆到路由器后台管理页面,之后进入"系统" —— "系统":
将其中的时区选项修改成 Asia/Shanghai,同时注意底下的 启用 NTP 客户端 是否开启以及 候选 NTP 服务器 是否设置正确。
打开浏览器,登陆到路由器的后台管理页面(Luci)。之后选择 "系统" —— "计划任务":
这里先说明一下 Openwrt / LEDE 的 crontab 格式:
f1 f2 f3 f4 f5 program
分 时 日 月 周 执行的命令
根据这个格式设置好 crontab 即可,以下是我自己所用的 crontab:
8 6 * * * /usr/bin/ruijie.sh 用户名 密码
我设定为每天早上 6:08 的时候进行锐捷认证,因为我所在的学校是每天晚上11点断网,隔天早上6点左右恢复,具体恢复时间似乎有一定的误差,所以延迟了8分钟。其实可以设得更晚一点的,毕竟我也不会那么早起床。你可以根据自己所在学校的情况设置执行脚本的时间。
填写好了点击 "提交" 即可。 提交完了之后记得重启路由器,或者到 "系统" —— "启动项" 中重启 cron 服务:
在锐捷 ePortal Web 认证的 POST 数据包中发现了 validcode 参数,为验证码。我所在的学校并没有强制在认证的时候要求输入验证码,但是经过测试发现:如果多次认证失败(例如用户名或密码错误)或者多次重复刷新认证页面,则认证过程需要输入页面上显示的验证码。
如果你所在的学校需要在认证过程中输入验证码,则不适合使用这个 Shell 脚本进行认证,需要使用 Python 等脚本语言实现验证码识别功能再进行认证。
锐捷的 ePortal Web 认证上了之后,向 InterFace.do?method=getOnlineUserInfo 这个接口中 Post 过去 userIndex 参数会明文显示用户的密码,感觉一点安全性都没有。(集美大学在认证系统升级之后已修复该问题)
我所在的学校在未认证的情况下,53端口(DNS)似乎是可以正常通信的。如果你所在的学校也有类似的情况,也许可以尝试搭建个53端口的代理实现免认证上网。