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

我校的校园网还就是与众不同,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文件,希望对大家有所帮助。

#!/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地址并添加进你的订阅。