学校的校园网环境前已介绍,登录外网需要登录计费网关(下列情况除外:通过IPv6连外网,访问某些特殊的网站比如这个:learn.akae.cn)。
学校提供两种登录计费网关的接口,一种是安装Dr.com城市热点客户端,这个在windows下用用还行;另一种是通过网页post数据到服务器,服务器记录下你的IP或者MAC等信息,这个方法比较简单(安装客户端还需要安装一个抓包工具,检测本地机器的数据包),而且跨平台,只要有浏览器就行了。
问题是,学校的网页接口比较two,加载要花一定的时间,完了还要点击登录,完了它还向弹出一个弹窗提示我不要忘记注销。最要命的是,你点击注销,它还要问一下“你确定注销吗?”,我不确定注销我点你干吗?总之,一句话,效率低,不爽。
用了linux后,什么事情都想在命令行下完成,于是写了一个简单的脚本来登录/注销校园计费网关。
这个脚本很简单,hello world级的,不过当初也费了我不少的脑细胞。毕竟写"hello world"也需要一定的基础呀。
用到的知识有:
1. html提交表单的方法和意义(GET与POST);
2. linux下下载工具的命令行使用;
3. shell脚本编写的基本知识;
脚本如下(其中有三个版本的代码,前两个被注释了):
- #! /bin/sh -
- # by: gipsa
- # on: 2011-12-26
- # at: dining hall C066
- # to: log out/in from/to the NJAU school webGate
- ### variables ###
- HOST_IN="" # 处理web登录的页面,登录信息提交到此
- HOST_OUT="/F.html" # 注销的页面,直接用web浏览器访问该页面也可以直接注销
- AGENT="Mozilla/4.0" # 伪装成Mozilla 4.0 浏览器,否则服务器程序可能不认
- USER="19209100" # 登录计费网关的用户名
- PASS="xxxxxx" # 登录计费网关的密码
- NAME="gipsa" # 脚本打印出的问候信息,自定义
- #### version 1 ## 'if-else' 'curl' version ###
- #if [ "$1" = "i" -o "$1" = "in" ]; then
- # curl -A "$AGENT" -s -d "DDDDD"="$USER" -d "upass"="$PASS" -d "0MKKey "="" -d "1MKKey "="" "$HOST_IN" > /dev/null
- # echo "user $NAME logged in."
- #elif [ "$1" = "o" -o "$1" = "out" ]; then
- # curl -s -A "$AGENT" "$HOST_OUT" > /dev/null
- # echo "user $NAME logged out."
- #else
- # echo "Usage: log i(n)|o(ut)"
- #fi
- #### version 2 ## 'case' 'wget' version ###
- #case "$1" in
- # 'i'|'in')
- # wget -U "$AGENT" -q -O /dev/null --post-data "DDDDD=$USER&upass=$$PASS&0MKKey =&1MKKey =" "$HOST_IN"
- # echo "user $NAME logged in."
- # ;;
- # 'o'|'ou'|'out')
- # wget -U "$AGENT" -q -O /dev/null "$HOST_OUT"
- # echo "user $NAME logged out."
- # ;;
- # *)
- # echo "Usage: log i(n)|o(ut)"
- # ;;
- #esac
- #### version 3 ## 'case' 'curl' version ###
- case "$1" in
- 'i'|'in')
- curl -A "$AGENT" -s -d "DDDDD"="$USER" -d "upass"="$PASS" -d "0MKKey "="" -d "1MKKey "="" "$HOST_IN" > /dev/null
- echo "user $NAME logged in."
- ;;
- 'o'|'ou'|'out')
- curl -s -A "$AGENT" "$HOST_OUT" > /dev/null
- echo "user $NAME logged out."
- ;;
- *)
- echo "Usage: log i(n)|o(ut)"
- ;;
- esac
脚本解释:
1. 通过网页登录校园计费网关的本质是将计费网关的帐号和用户名提交给服务器上的一个程序,程序验证信息通过后认为你登录了。
分析学校提供的登录页面可知,提交信息的所用的方法是HTTP的POST,脚本中的curl和wget都可以完成这个工作。具体使用参见wget和curl的手册。
注意,POST的字段要和网页上from中的一致,除了POST用户名和密码外还要POST两个奇怪的0MKKey和1MKKey(值为空,我真不知道是干什么用的)。
2. 脚本中的变量都用双引号引起来了,是为了防止空变量造成脚本解析错误。另外有些变量内容含有空格,必须用引号。关于shell中引号的使用,见文章底部扩展阅读。
3. shell脚本中case的功能比较强大,分支条件中支持多重比较,甚至支持通配符。关于脚本的语法等基础知识,见扩展阅读。
有任何疑问欢迎留言或者发邮件至gipsaliu[at]gmail.com
扩展阅读:
BASH引号那点事, IGI's blog.
《shell脚本学习指南》下载, %3D%3D
// 刘正义 @ NJAU on 2012-03-16
阅读(4331) | 评论(0) | 转发(0) |