wenxuan1999

给路由器配一个自动登录南科大校园网的脚本

Written by: Wenxuan SHI

我校的校园网还就是与众不同,Post 发出的数据包不是轻易就能弄明白的。本文提出了一种黑魔法 bash 脚本用于类 Unix 系统登录校园网。

南方科技大学(下称“妮科”)作为一所新兴高校,所用的网络系统都比较现代化。学校的若干系统在经历几番迭代后,于 2014 年完成了 CAS 认证的统一接入。

CAS_pages of SUSTech

# Intro:校园网的一些问题

尽管各大网络系统的 UI 和操作性很现代化、智能化,但是学校的一些网络管制措施还是很僵化。譬如,单设备限速 3Mbps (做不到智能调配),学生账户限制 5 台设备。其实妮科作为一个精英化教育学校,崇尚”小班化教学“,人数加起来还没有三个图书馆的座位总和多,这种限制非常奇怪。

一个账户 5 台设备的限制,对于一般学生应该刚刚好。而作为计算机系学生,吃土一年陆续添加进 WiFi 列表的: 3. 妮科人均拥有的三件套:电脑、平板、手机, 4. 流行于大学生的阅读圣器 Kindle 5. 过半数同学拥有的穿戴设备(手表), 7. 宿舍智能设备(联网台灯、智能空调管家), 8. 另一台 Windows 电脑(😁),拥有这么多设备不是因为我人傻钱多(恰恰相反),而是兴趣使然和专业需要。

我恰巧在妮科暑期网络升级,取消限速的那一天测试过湖畔宿舍区的网速,下载最高达到了 188Mbps ,上传最高达到了 240Mbps 。这还是在宿舍区,单宿舍 AP 下发的网速。听说在欣园宿舍区短时间飙升到了 400Mbps 。在教学区、科研区、家属区速度会更高。

(下图为妮科在每个宿舍门边安装的墙挂式无线 AP ,用于下发覆盖全校的 WiFi 信号,以及通过连接设备的网络活动监控学生的学习情况)

此外,所有连入校园 WiFi 的设备都需要 CAS 登录。这使得类似台灯、智能空调管家等不具有交互界面的设备不能正常连入校园网。

为了解决这一系列问题,我在咸鱼上购买了二手矿路由器Newifi D2,预先安装 OpenWrt 。并且发扬“敢闯 敢试 、求真务实、改革创新、追求卓越”的学校精神,探索一系列解决方案。

# def gao():

如果把路由器插到宿舍的网口里,那就直接失败了。因为有线网络是归属于中国电信的宽带业务,要付费的。 * 我们宿舍在刚进学校的那几个月办过,被坑的很惨—— OW 天天掉线,经常连不上网。 * 这里的解决方法是利用双网卡路由器的特性, A 网卡以 Client 模式无线连接学校 WiFi B 网卡以 AP 模式创建一个小局域网。

我想,这样的组网方式,接下来只要用任意一个设备登录校园网就行了。所有的设备是借由路由器 A 网卡的认证信息上网的。

# 挫折 1 :无法访问 CAS 登录页面、 OpenWrt 无法解析内网地址

刚创建完网络,发现所有网络都访问不了。但是路由器设置页面显示 A 网卡确实被分配了学校内网的 IP 。最后尝试手动以直接访问 IP 地址的方式访问南方科技大学校园网认证页面 ,成功。之后确实能上网了,但仍然不能访问学校官网、自助打印机、选课系统等校内服务。

在谷歌上查找答案,发现问题出在 DNS 解析上(惊喜:首先发现这个问题并在恩山论坛发帖的是妮科的一个学长)。路由器没有把学校的 DNS 继承下来。妮科为了方便,对内网使用自己的 DNS 来实现ACM OnlineJudge、自助打印服务、水电充值等业务。这样只要在浏览器的地址栏输入 acm/ pms/ 等等短地址就可以访问对应页面了。

在没有完成校园网认证之前,妮科会把所有网络请求重定向到 cas.sustech.edu.cn 服务器上。正常使用校园 DNS 的设备可以解析这个服务器,而路由器因为安全原因自顾自地忽略了所有内网的 DNS 解析,也就会出现无法解析地址的错误。

解决方法是在路由器 DNS 设置的时候取消“重绑定保护”。之后就一切正常啦。

# 挫折 2 :挤掉线

配置完这样一套网络以后,我把空调、台灯、 kindle 等等一堆东西都连接了上来。第二天出门上课的时候给同学演示“远程关空调”,结果当场失败。尴尬之余,排查原因,发现因为超出了单账号 5 台设备的限制,路由器被挤掉线了。出门时身上携带的设备又自动连接到了校园网,但设备总数怎么算也小于 5 个设备,理应不会有问题。

更诡异的是,这个情况只在我“下山”上课的时候出现,“上山”上课的时候不会发生。(基于海拔判断,我住“半山腰”湖畔宿舍,无论到哪个教学区都远)

后来发现:从湖畔宿舍走到山下第一教学楼的路上,校园网 5GHz 频段的信号非常弱,因此手机在 2.4GHz 频段和 5GHz 频段之间来回跳动,而 CAS 因为这个原因将手机判定为两个不同设备设备。( -_-||

解决这个问题比较困难,我决定写一个自动登录校园网的脚本,然后放在路由器上定时运行。

# 脚本翻车

就算是简单网络操作,我也只会 Python 。由于 Python 是解释型语言,首先需要在路由器上安装 Python 解释器。这是崩溃的开始——路由器闪存只有 32MB ,还没下载完路由器就满了。该方案失效。

接着我试图将 Python 安装在路由器的外接设备上。在搞完了一堆软链接、硬链接的系统问题后, Python 终于可以在路由器上运行了!我怀着激动的心情在路由器上跑了几个算法竞赛的题目……看来路由器的性能还是可以胜任算法竞赛的。但最终运行登录脚本的时候,发现路由器还是卡顿了将近 10 秒(脚本用到了一个大字符串的正则匹配)。不可忍受,弃用了该方案。

期间路由器经历了无数多次 Reset Reboot ,详见上一篇博客文章“搭建电影平台”。

最终我决定学习一下 linux 脚本怎么写。然而万事万物都不是那么简单的——南科大校园网认证偏偏不像其他学校那么简单,只是 post 提交一个账户和密码表单。妮科出于一些目的,还需要 post 一个古怪的“ execution" 。而这个 execution ,是访问网页的时候服务器生成的一次性长字符串,需要从 HTML 里挑出来。

我不妨贴出 Python 代码,以解释登录校园网的难点:

Python Code

# Linux Shell 脚本

最终我还是搞明白了 Shell 8 种文本串处理的方法,利用 grep ${} 两个命令将 execution 处理出来了。下面直接分享这个 sh 文件,希望对大家有所帮助。

SUSTech_wifi_login.sh
#!/bin/bash
source /etc/profile
set -e
curl https://cas.sustc.edu.cn/cas/login?service=http%3A%2F%2F172.16.16.20%3A803%2Fsustc_cas.php > a.txt
s=$(grep -o -E "on\"\ value=\"(.+?)\"" a.txt)
echo $s
s=${s#*\"}
s=${s#*\"}
s=${s%%\"*}
echo $s
unm=此处填入教 / 学工号
pwd=此处填入密码
curl "https://cas.sustc.edu.cn/cas/login?service=http%3A%2F%2F172.16.16.20%3A803%2Fsustc_cas.php" --data "username=$unm&password=$pwd&execution=$s&_eventId=submit&geolocation="

其中, 7~9 行是诡异的黑魔法。是我上班摸鱼期间摸索出来的。

接下来,只要把脚本放在路由器上,定时运行就好了。

# 要是一切都那么简单就好了

定时运行一般都用 CronTab ,只要配置好 CronTab 就可以按照自己想要的时间运行制定的脚本。但是,配置 CronTab 也踩了好多雷。

首先, 文末一定要有换行符 ,否则,最后一条 CronTab 将不执行。(无数血泪!!!)

其次, CronTab 要有足够的权限运行脚本。如果不自信的话,脚本权限应该设置成 777

再次,脚本的第一行要加上 #!/usr/bin/sh 来保证 shell 脚本是由 shell 运行的。最好能在第二行source 你的 profile 文件,以拥有正确的环境配置。


经历了千辛万苦,终于能自动登录南科大校园网了。终于达成了随时随地开关寝室空调,以及躺在床上关舍友的台灯的目标。经过一些配置,寝室的空调在凌晨 2:00 上升至 27 ° C ,并在凌晨 3:00 自动关闭。暑期的电费终于降了一点……

新生的军训就快结束了,他们即将回校参与积分选课大 (赌)场,用你想不到的高分占领你心仪的人文公选课!几天后,我将介绍怎么样写一个简单的抢课脚本,让你在积分选课落选后“捡漏”,和 1000 个人抢到个位数的课程余量。敬请期待。

如果你觉得这篇文章不错,并且喜欢我的创作,欢迎收藏Whexy的博客 。博客也实现了 RSS 订阅功能,如果你有 RSS 阅读器,可在博客边栏找到 RSS 地址并添加进你的订阅。


Likes