wenxuan1999

自动登录南科大校园网的 shell 脚本

Wenxuan Shi /
August 22, 2019
13 min read

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

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

校园网的一些问题

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

一个账户 5 台设备的限制,对于一般学生应该刚刚好。而作为计算机系学生,吃土一年陆续添加进 WiFi 列表的:

  1. 妮科人均拥有的三件套:电脑、平板、手机
  2. 流行于大学生的阅读圣器 Kindle
  3. 过半数同学拥有的穿戴设备(手表)
  4. 宿舍智能设备(联网台灯、智能空调管家)
  5. 另一台 Windows 电脑(😁)

拥有这么多设备不是因为我人傻钱多(恰恰相反),而是兴趣使然和专业需要。

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

妮科在每个宿舍门边安装的墙挂式无线 AP
妮科在每个宿舍门边安装的墙挂式无线 AP

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

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

挫折:

如果把路由器插到宿舍的网口里,那就直接失败了。因为有线网络是归属于中国电信的宽带业务,要付费的。

我们宿舍在刚进学校的那几个月办过,被坑的很惨 —— 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 代码,以解释登录校园网的难点:

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 个人抢到个位数的课程余量。敬请期待。

2021 年更新:因学校更换新教务系统,原抢课脚本失效,故删除文章。

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

© LICENSED UNDER CC BY-NC-SA 4.0