Linux下移动CMCC WLAN自动连接认证

山东移动的WLAN目前覆盖了很多居民区、公共场所和高校。价格低廉,速度尚可,普通网络应用绰绰有余,准备把家中的10M廉通宽带打入冷宫。

不过CMCC WLAN每次都要Web页认证比较麻烦。幸亏Linux系统的Network Manager有脚本钩子,可以很轻松地解决此问题。

首先先连接一次CMCC接入点,NetworkManager会自动创建一个连接,可以将其设置为自动连接,这样每次开机就可以自动连接了。之后要解决自动认证的问题,这里参照了网上关于OpenWrt自动连接CMCC的脚本:

新建/etc/NetworkManager/dispatcher.d/05-cmcc

sudo gedit /etc/NetworkManager/dispatcher.d/05-cmcc

脚本为以下内容:

#!/bin/bash
 
INTERFACE=$1
STATUS=$2
 
bpssUSERNAME="***********"
bpssBUSPWD="******"
 
if [[ $CONNECTION_ID = *CMCC* ]]
then
	export PATH=.:$PATH
	mkdir -p /tmp/cmcc
	touch "/tmp/cmcc/$CONNECTION_ID"
 
	#Fake UA should be better ;)
	user_agent="Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0)"
 
	case "$STATUS" in
		'up')
			#login_pre
			wget "http://www.baidu.com/" -O /tmp/cmcc/login_pre.html -U "${user_agent}"
 
			action_url=$(cat /tmp/cmcc/login_pre.html|grep "form action"|awk -F'"' '{print $2}'|head -1)
 
			wlanuserip_1=$(cat /tmp/cmcc/login_pre.html|grep "wlanuserip_1"|awk -F'"' '{print $8}'|head -1)
			wlanacname_1=$(cat /tmp/cmcc/login_pre.html|grep "wlanacname_1"|awk -F'"' '{print $8}'|head -1)
			wlanparameter_1=$(cat /tmp/cmcc/login_pre.html|grep "wlanparameter_1"|awk -F'"' '{print $8}'|head -1)
 
			wget "${action_url}?bpssUSERNAME=${bpssUSERNAME}&bpssBUSPWD=${bpssBUSPWD}&wlanuserip_1=${wlanuserip_1}&wlanacname_1=${wlanacname_1}&wlanparameter_1=${wlanparameter_1}&wlanuserfirsturl_1=http://www.baidu.com/&ssid_1=&userAgent_1=${user_agent}&usertype_1=pc&gotopage_1=/cmccpc.jsp&css_1=/css/cmccpc_include.css&sucesspage_1=/cmccpc_index.jsp&cookieage=1&loginmode=static&wlanacssid=&issaveinfo=" -O /tmp/cmcc/login_res.html -U "${user_agent}" --no-check-certificate
			#iwconfig wlan0 rate 12M
			;;
		'down')
			if [ -e /tmp/cmcc/login_res.html ]
			then
				base_url=$(cat /tmp/cmcc/login_res.html|grep "base href"|awk -F'"' '{print $2}')
 
				logout_url1=$(cat /tmp/cmcc/login_res.html|grep "LogoutServlet"|awk -F'"' '{print $2}')
				logout_url2=$(cat /tmp/cmcc/login_res.html|grep "ATTRIBUTE_UUID"|awk -F'"' '{print $2}')
				logout_url3=$(cat /tmp/cmcc/login_res.html|grep "ATTRIBUTE_IPADDRESS"|awk -F'"' '{print $2}')
 
				wget "${base_url}${logout_url1}${logout_url2}${logout_url3}1" -O /tmp/cmcc/logout_res.html -U "${user_agent}" --no-check-certificate
			fi
			;;
	esac
fi

这个方法实际上就是调用NetworkManager的脚本钩子,当连接建立的时候,判断连接名称是否包含“CMCC”(这个可以根据实际情况修改)。如果是,则wget读取一个网页,实际上应该会自动跳转到认证登录页面;从登录页面中获得登录所需参数;之后再用wget模拟登录提交(这里是GET的)。

之后将此脚本加执行权限:

sudo chmod a+x /etc/NetworkManager/dispatcher.d/05-cmcc

此方法在山东移动CMCC+Arch Linux下面测试通过。理论上只要是GET方法Web认证的都可以用此方法。

不过,CMCC似乎每隔一段时间(据说是8小时)会自动要求重新认证,表现为网络变得不通,打开网页重新跳转到登录页。这时候可以在登录页中手动登录,或者重连CMCC让其再次调用脚本。当然有兴趣的也可以自行修改上面脚本。


你可能感兴趣的:(Ubuntu)