开始之前

我在学校收了一个路由器后,开始折腾起了实现校园网的自动登录,因为本校的校园网要求是一人一号,并且只要设备想用校园网必须要登录才能上网,非常的恼人,还给宿舍的IoT设备连接网络造成了一定的麻烦。

在这之前已经有学校的大佬做过脚本并成功实现了自动登录,由于校园网在本校转设以后进行了一次更新,在我Ctrl+V后发现代码并不通用,遂开始研究大佬的脚本,并也成功实现了自动登录。但是在此之前我对Shell脚本是完全没有了解过的,以下内容可能会有纰漏错误,请大佬们多多包含并在评论区指出我的文章中的不足之处,多谢。

在教程开始之前,先要感谢大佬们的教程文章使得我也能够成功实现自动登录,这里放上本篇教程的参考与引用,并特别感谢学校的KMnO4大佬写的本校自动登录教程。

校内KMnO4大佬的文章:酷安:使用 Padavan 路由器实现校园网定时 Web 认证

来自甲烷气瓶博客的文章:Dr.COM校园网多设备解决方案——路由器 Padavan/LuCI 固件自动网页认证+Telegram Bot 定时发送连接情况

那么我们就废话不多说开始教程。

内容

本篇教程理论上适用于部分学校的以哆点(Dr.com)为模板制作的以网页方式登录的校园网,请注意您的路由器一定是以linux为底层的高自定义化的路由器系统固件,像是Openwrt、梅林、Padavan等系统固件,或者说您的路由器本身就自带了计划任务执行Shell脚本功能当然也是可以的。
本文完成于2021年12月4日,截止到本文的最后修改时间2023年9月6日,处于本校(即南京信息工程大学滨江学院/无锡学院)中的校园网仍然能够以本篇教程的方法实现自动登录。

2023年9月6日更新(重要):
目前有不少读者使用了我的这个方法,很高兴这个教程能被大家所成功应用。有些读者发现步骤2.3 第二步,获取路由器内网IP 中的操作是不必要的,参数 wlan_user_ip 留空即可直接登录 (前提是上游登录服务器自动从请求地址中获取了你的路由器IP,猜想是校园网登录服务器的可开启功能)
这可能能够提出一种新的玩法,即路由器可以保留原系统,只需要保证路由器底下有一台能够能够定时自动访问特定网络地址的设备即可(甚至可以是一台手机)。

能够实现的功能

  • 自动登录校园网(废话)
  • 直接使用设备连接路由器并开始使用校园网而不需要登录
  • 如果有需要,还可以多开几个虚拟机使用多个账号进行网络聚合以获得更高带宽(本教程不涉及,仅提供思路)

第一步,获取GET url

使用浏览器(最好是 Chrome 的内核浏览器)打开你的校园网链接,如本校的就是南京信息工程大学滨江学院/无锡学院校园网登录界面
F12打开开发人员工具,选择网络(NetWork),勾选保存日志(Preserve log),并在页面中进行正常登陆。

登录完成后,在开发者工具中的网络(NetWork)子页中寻找请求url(GET url)

(很神奇的是用不到POST,一些学校的网页登录可能需要用到POST而不能是GET,如果您发现GET不能成功登录,可以转至文章顶部寻找甲烷气瓶博客写的教程,写得非常好)

,一般来说是这么个格式:

1
http://10.1.99.100:801/eportal/portal/login?callback=dr1003&login_method=1&user_account=,0,账号@cmcc&user_password=密码&wlan_user_ip=内网IP&wlan_user_ipv6=&wlan_user_mac=设备MAC&wlan_ac_ip=10.1.1.1&wlan_ac_name=&jsVersion=4.1.3&terminal_type=1&lang=zh-cn&v=9960&lang=zh

把这个url记下来,随后退出校园网登录,我们要测试这个url是否能够使用。

以Windows11系统为例,我们需要在系统设置-网络和Internet-高级网络设置-硬件和连接属性 中查找用来测试的设备的内网IP(以本校为例一般是10.x.x.x)(Windows这货藏重要信息是越来越能藏了),其他系统的设备请自行解决获取内网IP,网络上有很多办法。

获取到IP以后,我们要替换url中的wlan_user_ip=后面的IP(为了防止IP自动更换),并把它粘贴到浏览器网址栏中,敲击回车,如果显示登陆成功,恭喜你,这篇教程对你有用,请继续向下看,如果失败了请转到文章开头提到的甲烷气瓶博客的文章。

解决完请求url,我们要开始操作路由器获取它的内网IP了。

第二步,获取路由器内网IP

为什么要获取内网IP呢,直接填入路由器的内网IP不行吗?因为校园网给予设备的IP是动态的,并且其生命只有一天甚至更少,所以我们每登录一次就要获取一次内网IP。

将你的路由器连上校园网,并用一台设备连接到路由器以便对路由器进行操作。进入你的路由器后台终端,也就是常说的黑底白字看起来贼高端的命令行窗口。一般来说路由器后台网页中可以找得到,您也可以用通过ssh登录进入路由器后台,但无论是哪种方式,切记一定要以管理员账号登陆,默认是root。

大部分的以Linux开发的系统都可以使用 ip addr 这条命令获取到设备的大部分网络信息,如果没找到,请尝试 ifconfig,都能获取到内网ip。

随后,请在密密麻麻的字行间找到属于您的路由器的内网ip,我们就只要它,请您记住这个位置,我们要开始截取它了。

这里给出我截取路由器内网ip地址的命令,您可以按照这个命令进行参考。

1
# ip addr | grep eth0.1 | grep inet | awk '{print $2}' | cut -d "/" -f 1

正所谓授人以鱼不如授人以渔,并且您需要按照您路由器的自身情况参与到构成专属于您的路由器的截取内网IP的命令中来,下面我来仔细讲讲用这行命令是如何截取出我们需要的内网IP的, 请看以下表格中对应的命令的具体作用,但羞于文笔不好,如果有不理解的可以前往表格中所指的链接查看更多(菜鸟教程对于学习计算机相关的朋友来说真是个好东西)。

请注意您的命令格式,使用 | 将两个命令隔开,“|”两边带有空格,并且第一个命令一定是ip addr(也就是您需要截取的内容的获取命令)

一个例子:

1
ip addr | grep inet
命令 grep inet awk ‘{print $2}’ cut -d “/“ -f 1
作用 定位到关键词”inet”的所在行 截取出当行的第2个字符块 截取出以”/“字符分割的前字符块
详细 菜鸟教程Linux grep 菜鸟教程Linux awk 菜鸟教程Linux cut

首先第一个,grep eth0.1的作用,从字段中找到含有此关键词的对应行,这里我使用连接了校园网的网卡名称进行定位。

定位的结果:

1
2
3
eth0.1@eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
link/ether 88:c3:97:b4:65:b9 brd ff:ff:ff:ff:ff:ff
inet 10.2.91.138/18 brd 10.2.127.255 scope global eth0.1

第二个,grep inet,不再赘述,这里是直接截取到有内网IP的那一行。

截取结果:

1
inet 10.2.91.138/18 brd 10.2.127.255 scope global eth0.1

第三个,awk '{print $2}',截取出第二个子块,也就是 inet 后面的IP,如果是awk '{print $1}',截取出来的则是 inte 。

截取结果:

1
10.2.91.138/18

还没完,我们还需要把子网掩码去掉,也就是‘/’后面的内容,第四个命令cut -d "/" -f 1 ,这是个带有参数的命令,作用是截取“/”之前的文字段,如果 -f 的参数写的是 2,你将得到子网掩码 18。

1
10.2.91.138

如果您如上成功写出您的命令并以此获取内网IP,那么请保存好这条命令。恭喜你,第二步的工作完成了,我们终于可以开始编写Shell脚本了!

第三步,编写脚本

新建一个文本文档,用 Notepad++ 打开它,当然其他文本编辑器也是可以的。

这里给出我的脚本,仅供参考。

1
2
3
CURRENT_IP=$(ip addr | grep eth0.1 | grep inet | awk '{print $2}' | cut -d "/" -f 1)
#linux
curl 'http://10.1.99.100:801/eportal/portal/login?callback=dr1003&login_method=1&user_account=,0,账号@cmcc&user_password=密码&wlan_user_ip='$CURRENT_IP'&wlan_user_ipv6=&wlan_user_mac=000000000000&wlan_ac_ip=10.1.1.1&wlan_ac_name=&jsVersion=4.1.3&terminal_type=1&lang=zh-cn&v=9960&lang=zh'

第一行定义一个变量 CURRENT_IP ,我们用它来存放内网IP,等号后面输入 $() (括号里放第二步您成功截取路由器IP的命令)。

第二行执行curl,后面使用单引号括住您在第一步能用来成功登录校园网的请求 url,并且将其中wlan_user_ip等号后面的内容改成变量'$CURRENT_IP'

Ctrl+S保存。

这样一来,Shell 脚本也编好了。

第四步,上传路由器

我们接下来需要将它上传到路由器中,有很多办法。

  • 方法一

将上文编辑好的文本文档改成UTF-8编码,像是在 NotePad++ 的顶栏中找到编码-转为UTF-8编码,保存退出。

改变后缀,从 .txt 改成 .sh ,并且用英文命名,如auto_log.sh(以下都以此文件名示范)。

使用SSH或路由器管理网页的文件管理将这个脚本上传到路由器的\etc\storage\文件夹中,

如果没有这个文件夹,请在路由器的命令行窗口中使用命令创建这个文件夹。

1
2
3
4
5
进入storage文件夹的步骤,请一行行执行命令
# cd /etc
# cd storage
如果发现没有这个文件夹,请执行创建文件夹指令
# mkdir storage

然后在路由器管理页面的文件管理中上传sh文件到\etc\storage\里

如果使用 ssh 上传,可以在 Windows 的 PassShell 中执行

1
scp 本地脚本文件位置 路由器用户名@路由器IP:/etc/storage/
  • 方法二

在路由器终端中,输入

1
2
3
4
5
请一行行执行命令
# cd /etc/storage
如果没有这个文件夹,参照方法一中创建

nano auto_log.sh

然后将本地的脚本内容直接复制到里面,使用Ctrl+X退出,输入Y后再敲击一次回车保存。


方法很多,不再一一赘述,接下来我们要开始测试脚本是否可用,在路由器终端中输入

1
sh /etc/storage/auto_log.sh

如果您是完全按照教程中的流程走,返回为

1
dr1003({"result":0,"msg":"IP: 10.x.x.x 已经在线!","ret_code":2});

或者

1
dr1003({"result":1,"msg":"Portal协议认证成功!"})

而不是

1
error xxxxxxxxxx

恭喜您,此脚本可用,就差最后一步,我们就可以完成路由器的自动登录了。

第五步,添加计划任务

打开您的路由器管理页面的自动计划,以 OpenWrt 为例
在底部添加

1
00 8 * * * sh /etc/storage/auto_log.sh

运行时间可以自己定,在 crontab.guru 中可以自行计算需要的 cron 指令

理论上来说这样就已经完成了自动登录的部署,您可以在第二天连上您路由器的 wifi 测试您的网络是否已经可以上网,如果成功,恭喜您,本篇教程成功使您的路由器成功的实现了自动登录校园网的功能。

PS

如果您在根据本篇教程进行部署中出现了不可解决的问题,可以在评论下留言,或是直接通过 邮箱 联系我,我会尝试帮助您解决问题。

指路:如果您是无锡学院/南京信息工程大学滨江学院的学生,除了本篇以路由器登陆为目的的脚本与自动计划的方法登录校园网外,您还可以参考查阅 [Gitee] AutoConnect 这样以 Windows 桌面程序为载体的自动登陆方案。

后话

关于实现路由器掉线自动重连的部分可阅 实现路由器检测网络状态并重新登录