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

来源:互联网 发布:原田知世 老公是 编辑:程序博客网 时间:2024/05/01 22:58

山东移动的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=$1STATUS=$2 bpssUSERNAME="***********"bpssBUSPWD="******" if [[ $CONNECTION_ID = *CMCC* ]]thenexport PATH=.:$PATHmkdir -p /tmp/cmcctouch "/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_prewget "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 ]thenbase_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-certificatefi;;esacfi

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

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

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

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

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