在Linux下通過WEB認(rèn)證方式上網(wǎng)
摘要
通過分析 windoze 下 Web 認(rèn)證過程,提出在 Linux 中用*腳本*實(shí)現(xiàn)通過 Web 認(rèn)證方式上網(wǎng)的方法
問題由來
近來,隨著寬帶入戶,越來越多的 ISP 采用 Web 認(rèn)證這種接入認(rèn)證技術(shù)。Web 認(rèn)證從用戶的角度看,是指用戶在瀏覽器中通過 Web 頁面輸入用戶名和密碼的認(rèn)證過程。多數(shù) ISP 號(hào)稱無需客戶端軟件,實(shí)際情況卻是:Windoze 下用戶可以順利通過 Web 認(rèn)證上網(wǎng),但 Linux 用戶卻沒有這么幸運(yùn)。
分析原因
什么原因呢?解決問題還需從分析認(rèn)證頁面入手,下面的分析主要針對我這里的情況。在 Mozilla 中打開認(rèn)證頁面后,沒有顯示任何內(nèi)容。仔細(xì)分析認(rèn)證頁面,發(fā)現(xiàn)認(rèn)證頁面采用 JavaScripts 編寫,并且是針對 IE 編制的。IE 并未完全按照標(biāo)準(zhǔn)使用 JavaScripts。IE 對 JavaScripts 做了一些擴(kuò)充,主要有以下幾項(xiàng):
* .cab files for download of binaries;
* document.all;
* element.innerHTML;
...
詳情請參閱 http://www.stopbadtherapy.com/standards.shtml
IE 對 JavaScripts 的這些擴(kuò)充,Mozilla 是不支持的,實(shí)際上 Mozilla 對標(biāo)準(zhǔn) JavaScripts 的支持比 IE 好。所以,這些有 IE 特點(diǎn)的認(rèn)證頁面 Mozilla 等瀏覽器自然無法通過了。
從用戶瀏覽器的角度看,Web 認(rèn)證除了通過 Web 頁面輸入用戶名和密碼外,還需要通過 http 協(xié)議傳送客戶由 DHCP 獲得的 IP。有些 ISP 在用戶登錄到認(rèn)證頁面時(shí),由瀏覽器自動(dòng)下載 .cab 文件,然后執(zhí)行該文件獲得用戶的 IP,再傳給 Web Server。還有些 ISP 在用戶通過認(rèn)證后,會(huì)在客戶端彈出一個(gè)計(jì)時(shí)窗,定時(shí)向 ISP 發(fā)送 keep-alive 包。當(dāng)然,Web 認(rèn)證是一個(gè)比較新的方式,還沒有形成標(biāo)準(zhǔn),所以各提供商的方法也不盡相同,所謂各村有各村的高招,你那里的方法就很有可能與我的不同,但道理應(yīng)該是一樣的。根據(jù)以上的分析,可以看出 Linux 用戶自然不可能用非 IE 兼容的瀏覽器直接通過登錄 Web 認(rèn)證界面上網(wǎng)啦。
解決方法
好了,問題就在這些 Web 頁面使用 IE 方言的 JavaScripts 上,有幾種解決方法:
1。使用 Linux 下 IE 兼容的瀏覽器,有嗎?誰知道請告訴我。
2。使用 wine + IE 的方法,有成功的嗎?大家共同分享。
3。如果將這些鳥語改為普通話,我們就可以用 Mozilla 等非 IE 瀏覽器通過 Web 認(rèn)證方式上網(wǎng)了。
4。要求 ISP 提供支持 W3C 標(biāo)準(zhǔn)的認(rèn)證頁面。
5。分析 web 認(rèn)證的原理,編寫認(rèn)證程序。
最理想的方法四,可是我等不急,也不一定能等到,也許你比我幸運(yùn)。我采取第三種方法,對于方法三,你一定會(huì)問:認(rèn)證頁面在 Web Server 上,我無權(quán)修改,行不通。確實(shí)如此,這里有個(gè)變通的辦法:下載認(rèn)證頁面,按照 JavaScripts 標(biāo)準(zhǔn)修改并保存在本地,每次上網(wǎng)前用本地經(jīng)過修改的 Web 認(rèn)證頁面而非 Web Server 的認(rèn)證頁面就可以了。具體修改方法,參照 http://www.stopbadtherapy.com/standards.shtml 中的對照表,找出認(rèn)證頁面使用 IE 方言的 JavaScritps,根據(jù)對照表提供的修改建議對你的認(rèn)證頁面作出相應(yīng)修改。對于使用.cab 的認(rèn)證頁面,情況就比較復(fù)雜。需要分析這個(gè).cab 在你的 JavaScripts 中的用法,判斷它的功能,我這里是用它獲得本地 IP。所以,我在本地執(zhí)行腳本獲得 IP 來模擬這個(gè)功能。似乎.cab 多與 IP 有關(guān)。
一個(gè)例子
* 以我這里為例,我的使用環(huán)境:
ISP:鐵通 ADSL
認(rèn)證方式:Web 認(rèn)證
ISP 的接入服務(wù)器:華為 Quidway MA5200E/F (具體型號(hào)不能完全確定)
Linux:GENTOO 1.4 rc-3
Browser: Mozilla 1.4a/Phoenix 0.5
* 在 Linux 下用 mozilla (一定要用非 IE 瀏覽器獲得認(rèn)證頁面,這話有點(diǎn)多余,但有的用戶是在 Window$ 下調(diào)試的),訪問 ISP 的 WEB 認(rèn)證頁面時(shí),瀏覽器中沒有顯示任何內(nèi)容,根本無法輸入帳號(hào)和密碼,更談不上通過認(rèn)證。這難不倒咱 linuxer, 查看認(rèn)證頁面(/index.jsp)源碼,發(fā)現(xiàn)這兩段 javascript:
id="PortalClient"
codebase=http://61.61.61.61:80/PortalAX.cab#version=1,0,1,8
...
var clientIp = PortalClient.localIP;
var languagetype = 0;
if ((clientIp=="") (clientIp==null)) {
window.parent.location.href="/ipError.jsp";
} else {
window.parent.location.href="/queryPort.jsp?ip="+clientIp+"newbl="+languagetype;
}
可以看出它用 PortalClient 獲得本地的 IP,如果成功,轉(zhuǎn)到 http://你的WEB認(rèn)證頁面/queryPort.jsp?ip=你當(dāng)前的IP 。而 Mozilla 不支持它獲取 IP (PortalClient,是針對IE的,唉,這個(gè)程序編得太短視),看來問題出在這里。既然如此,我們可以手工加上自己的 IP(這個(gè) IP 是與 ADSL 相聯(lián)的網(wǎng)卡從 ISP 的 DHCP 服務(wù)器獲得的地址)。在 Mozilla 地址欄中輸入:
http://61.61.61.61/queryPort.jsp?ip=192.168.0.2
--------^^^^^^^^^^^------------------^^^^^^^^^^^
--------你的ISP認(rèn)證服務(wù)器 ------------- 你當(dāng)前的IP
嗒嗒,登錄頁面出來啦!
趕快輸入帳號(hào),密碼,按登錄按鈕(期待中。。。)。
viva!!!
ISP 的首頁終于被揪出來啦,在終端中 ping www.gnu.org ,ping 通,沒問題。
* 至此,在 Linux 下 web 認(rèn)證方式已經(jīng)完成。方法很簡單,每次上網(wǎng)時(shí),在 mozilla 的地址欄中輸入:
http://你的ISP認(rèn)證服務(wù)器地址/queryPort.jsp?ip=你當(dāng)前的IP
登錄頁面出來后,和 IE 中的操作過程完全一樣。
* 當(dāng)然你可以把這些步驟寫成一個(gè)腳本,以后簡單執(zhí)行腳本就可以了。
#!/bin/bash
dhcpcd eth1
phoenix http://61.61.61.61/queryPort.jsp?ip=`ifconfig eth1 grep inet sed 's/^ *//' sed 's/ /:/g' cut -f3 -d:` &
說明:
eth1 是與 ADSL 聯(lián)的網(wǎng)卡名,根據(jù)你的實(shí)際情況填寫。
61.61.61.61 是我這 ISP 的認(rèn)證地址。
后面一段是獲得 eth1 的 ip 地址。
注意!一定要用非 IE 瀏覽器獲得調(diào)試認(rèn)證頁面,因?yàn)?IE 可以執(zhí)行認(rèn)證頁面的 JavaScripts,有些認(rèn)證過程實(shí)際上是執(zhí)行多個(gè)頁面完成的,IE 最后停留的頁面不一定是起始的認(rèn)證頁面,你有可能漏掉前面的重要信息,我這里就是這種情況。
另外一種方法
如果你對方法 3 不滿意,可以用方法 5,繼續(xù)分析 web 認(rèn)證的原理,編寫自己的認(rèn)證程序。其實(shí)搞清原理后,實(shí)現(xiàn)的方法更簡單,更靈活,而且在 ISP 要求客戶端定時(shí)發(fā)送 keep-alive 包的情況下,也只能采取這種方法。我是這樣做的:
1。用網(wǎng)絡(luò)分析軟件(如:ethereal),抓取正常認(rèn)證過程的通訊包;
在 windoze 下,用 ethereal 抓包。注意抓包時(shí),除了 IE 不要啟動(dòng)其它產(chǎn)生網(wǎng)絡(luò)通訊的程序,以免產(chǎn)生干擾數(shù)據(jù);保存這些通訊包。
2。分析所抓包的內(nèi)容;
只要看一眼 web 認(rèn)證過程產(chǎn)生的通訊包,你就明白我為什么說這種方法更簡單了。簡單講,web 認(rèn)證方式實(shí)際是客戶端用 http 協(xié)議向 ISP 發(fā)送用戶名、密碼和 IP 等內(nèi)容的過程??蛻舳俗x取認(rèn)證頁面;將填寫好認(rèn)證頁面表格發(fā)送到 ISP 的認(rèn)證服務(wù)器。過程就這么簡單。
3。編寫生成這些包的程序;
用任意一個(gè)支持 http 協(xié)議的語言或工具,編寫向認(rèn)證服務(wù)器 POST 認(rèn)證頁面中 form 的程序即可,甚至讀取認(rèn)證頁面都不需要。我用 curl 和 python 各做了一個(gè)。如果你略微了解 http 協(xié)議,只要找到認(rèn)證頁面中向服務(wù)器 POST 用戶名、密碼等數(shù)據(jù)的 form,然后轉(zhuǎn)換為你采用語言的語法格式就可以了,根本不需要分析認(rèn)證頁面中繁雜的 Javascripts。對計(jì)時(shí)窗發(fā)出的 keep-alive 包也采用同樣的方法。
例子:
* 認(rèn)證頁面中的
<form id="mainform" name="mainform" method="post" action="http://61.61.61.61:80/secu/webLogin.jsp">
<input type="hidden" name="connectname" value="">
<input value="-1" name="connecttype" type="hidden">
<input value="0" name="consumeright" type="hidden">
<input value="0" name="separatecard" type="hidden">
<inputvalue="192.168.000.000" name="localip" type="hidden">
<input value="0" name="IsIndex" type="hidden">
用戶名:<input name="username">
密 碼:<inputname="password" type="password">
<input name="lianjiewangluo" type="submit">
* 用 curl 寫的一個(gè)腳本:
- #!/bin/bash
- /etc/init.d/myiptables start
- dhcpcd eth1
- MYIP=`ifconfig eth1 grep inet sed 's/^ *//' sed 's/ /:/g' cut -f3 -d:`
- echo $MYIP
- UN=88888888
- SERVER=61.61.61.61
- curl --trace trace.txt -A 'Mozilla' -d "username=$UN&password=8888&localip=$MYIP&connectname=&connecttype=-1" http://$SERVER/secu/webLogin.jsp
說明:curl 是一個(gè)用 url 語法傳輸文件的命令行程序,支持 http,ftp 等協(xié)議,類似 wget。
上例中,curl 的命令行參數(shù) -A 指明客戶端的類型,這是服務(wù)器為了安全,需要指明。Mozilla 或 IE 都可以,我更愿意用 Mozilla。 -d 是必需的,表示用 POST 方法。-d 后的內(nèi)容就是用戶名、密碼 IP 地址等信息,根據(jù)你的認(rèn)證頁面中 form 的 input 項(xiàng)目填寫,內(nèi)容與其保持一致,參數(shù)間用 & 分開。后面是認(rèn)證頁面的地址。執(zhí)行這個(gè)腳本后,返回 200 OK,表示認(rèn)證成功,否則,仔細(xì)檢查 -d 后的參數(shù)是否正常,地址是否正確。
* 用 python 寫的認(rèn)證程序:
#!/usr/bin/env python
import httplib, urllib
params = urllib.urlencode({'connectname': '',
'connecttype': -1,
'consumeright': 0,
'separatecard': 0,
'localip': '192.168.000.000',
'IsIndex': 0,
'username': 88888888,
'password': 8888})
headers = {'Accept': 'text/html', 'User-Agent': 'Mozilla',
'Content-Type': 'application/x-www-form-urlencoded'}
server = '61.61.61.61'
path = '/secu/webLogin.jsp'
conn = httplib.HTTPConnection(server)
conn.request("POST", path, params, headers)
r1 = conn.getresponse()
print r1.status, r1.reason
data1 = r1.read()
print data1
conn.close()
產(chǎn)生 keep-alive 包的程序
#!/usr/bin/env python
import httplib
def testHttplib(server, path):
req = httplib.HTTP(server)
req.putrequest('GET', path)
req.putheader('Accept', 'text/html')
req.putheader('User-Agent', 'Mozilla')
req.endheaders()
ec, em, h = req.getreply()
fd = req.getfile()
return fd.read(), (ec, em)
myip = '192.168.000.000'
server = '61.61.61.61'
path = '/ClientProcess.jsp?MsgType=1&ISNNO=1001&LocalIP=' + myip
# print 'testing "%s%s"' % (server, path)
dataHttplib, result = testHttplib(server, path)
# print "data length (httplib):", len(dataHttplib), result
# print dataHttplib
說明:
python 是一個(gè)功能強(qiáng)大的腳本語言,與 Perl 類似。正如你看到的,它和 curl 完成同樣的工作,但更優(yōu)雅。這里要注意別漏掉'User-Agent' 和 'Content-Type' 內(nèi)容,我在這個(gè)上面浪費(fèi)了不少時(shí)間。其它與 curl 的說明一樣。
最后,將下面內(nèi)容加到 crontab 中,保證每 5 分鐘向 ISP 發(fā)送一個(gè) keep-alive 包,模擬計(jì)時(shí)窗功能。
*/5 * * * * /home/zest/keepalive.py
方法 5 的總結(jié):
* 方法簡單,思路清晰
* 適應(yīng)性廣
* 腳本實(shí)現(xiàn),脫離瀏覽器和圖形環(huán)境,更適于需要自動(dòng)登錄的環(huán)境(例如,自建的服務(wù)器)
一些成功的例子:
* whz81 朋友
南京電信
* zest 就是我
西安鐵通
* 你的位置
歡迎你與大家共同分享你的成功經(jīng)驗(yàn)
相關(guān)的鏈接:
* 從特有的 DOMs 和 Markup 轉(zhuǎn)移到 W3C 標(biāo)準(zhǔn)。http://www.stopbadtherapy.com/standards.shtml
后記
這篇小文是我在解決 Linux 下 Web 認(rèn)證方式上網(wǎng)問題時(shí)的一些文字總結(jié)。由于本人的能力有限以及環(huán)境的限制,文中的內(nèi)容肯定相當(dāng)粗淺,會(huì)存在一些錯(cuò)誤,希望各位能夠批評(píng)指正,共同完善這篇文字。這里,我希望盡量說明解決問題的思路和方法,而不是只給出結(jié)果。授人以魚,不如授人以漁。另外,這篇文字是兩個(gè)時(shí)期完成的,方法 3 是在四月完成的。最近,七月,我的 ISP 改變了 Web 認(rèn)證頁面,所以產(chǎn)生了方法 5。為了保持延續(xù)性,沒有刪除方法 3,所以比較羅嗦。
最后,歡迎大家分享自己的成功經(jīng)驗(yàn)。
相關(guān)文章

集成系統(tǒng)級(jí)Claw模式! Deepin 官宣發(fā)布 25.1 版本
deepin操作系統(tǒng)發(fā)布了最新的 25.1 版本更新,該版本基于 deepin 25 正式版積累的多輪內(nèi)測成果,在 AI 能力、內(nèi)核版本、桌面環(huán)境、文件管理器以及系統(tǒng)安全等方面進(jìn)行了更新2026-04-13
又一代老硬件退場! Linux 內(nèi)核正式放棄Intel 486 CPU
在過去的幾十年間,CPU 的架構(gòu)已經(jīng)經(jīng)歷了飛速發(fā)展,x86 系列就是其中之一,而 i486 則屬于該系列中的一個(gè),當(dāng)前,i486 的CPU處理器已經(jīng)夠老,從 Linux 7.1 開始將不再有對2026-04-09
趕緊收藏! 全網(wǎng)最全 Linux 命令總結(jié)
我把 Linux 中最常用、最實(shí)用、最常被問到的命令按照實(shí)際使用場景分類整理,方便你快速查閱和記憶,內(nèi)容覆蓋日常運(yùn)維、開發(fā)調(diào)試、性能分析、文件處理、網(wǎng)絡(luò)、安全、系統(tǒng)管2026-04-08
一分鐘內(nèi)檢查Linux服務(wù)器性能? 9個(gè)性能檢測常用的基本命令
今天我們來看看Linux系統(tǒng)中用于性能監(jiān)控的一系列命令,這些命令可以快速查看機(jī)器的負(fù)載情況,詳細(xì)請看下文介紹2026-03-18
從零基礎(chǔ)到精通! 適合高級(jí)用戶的15款Linux發(fā)行版推薦
Linux作為操作系統(tǒng)領(lǐng)域靈活性和可定制性的基石,提供了大量滿足不同用戶需求的發(fā)行版,今天分享適合高級(jí)用戶的15款Linux發(fā)行版2026-03-10
開箱即用? 這4個(gè)高手級(jí)Linux發(fā)行版遠(yuǎn)沒你想象的那么安全易用
如果你正在糾結(jié)用哪個(gè)發(fā)行版?零基礎(chǔ)新手別被“高端”“極客”“聲明式”這些詞沖昏頭腦,先用好用的,再慢慢進(jìn)階2026-03-10
這幾款SSH工具真的夠用了! Linux好用的ssh工具推薦
在Linux上使用SSH,您需要安裝一個(gè)SSH客戶端,今天整理找到的8 款 SSH / 終端工具,從免費(fèi)開源到企業(yè)級(jí)商用,從輕量化命令行到一站式工具箱,每款都做了介紹與對比,希望能2026-03-09
在Linux系統(tǒng)下有兩種用戶,即高級(jí)用戶root,普通用戶,高級(jí)用戶root可以在系統(tǒng)中做任何事情,普通用戶僅可在Linux系統(tǒng)中做有限的事情,下面我們就來看看切換方法2026-02-28
揭秘當(dāng)前登錄用戶的身份! Linux中使用logname命令的技巧
logname命令就是這樣一個(gè)簡單但強(qiáng)大的工具,它能幫助我們輕松獲取當(dāng)前登錄用戶的用戶名,今天,我們就來深入探索一下這個(gè)命令的工作原理、使用方法和最佳實(shí)踐2026-02-26
在 Linux 系統(tǒng)中,DNS 緩存是一種將域名和 IP 地址映射關(guān)系緩存在本地的機(jī)制,可以加快域名解析速度,并減輕 DNS 服務(wù)器的負(fù)載2026-02-26



