在Linux下怎么通過(guò)WEB認(rèn)證方式上網(wǎng)

這篇文章主要介紹“在Linux下怎么通過(guò)WEB認(rèn)證方式上網(wǎng)”,在日常操作中,相信很多人在在Linux下怎么通過(guò)WEB認(rèn)證方式上網(wǎng)問(wèn)題上存在疑惑,小編查閱了各式資料,整理出簡(jiǎn)單好用的操作方法,希望對(duì)大家解答”在Linux下怎么通過(guò)WEB認(rèn)證方式上網(wǎng)”的疑惑有所幫助!接下來(lái),請(qǐng)跟著小編一起來(lái)學(xué)習(xí)吧!

成都做網(wǎng)站、成都網(wǎng)站建設(shè)、成都外貿(mào)網(wǎng)站建設(shè)服務(wù)團(tuán)隊(duì)是一支充滿著熱情的團(tuán)隊(duì),執(zhí)著、敏銳、追求更好,是創(chuàng)新互聯(lián)的標(biāo)準(zhǔn)與要求,同時(shí)竭誠(chéng)為客戶提供服務(wù)是我們的理念。創(chuàng)新互聯(lián)建站把每個(gè)網(wǎng)站當(dāng)做一個(gè)產(chǎn)品來(lái)開發(fā),精雕細(xì)琢,追求一名工匠心中的細(xì)致,我們更用心!

摘要

通過(guò)分析 windoze 下 Web 認(rèn)證過(guò)程,提出在 Linux 中用*腳本*實(shí)現(xiàn)通過(guò) Web 認(rèn)證方式上網(wǎng)的方法

問(wèn)題由來(lái)

近來(lái),隨著寬帶入戶,越來(lái)越多的 ISP 采用 Web 認(rèn)證這種接入認(rèn)證技術(shù)。Web 認(rèn)證從用戶的角度看,是指用戶在瀏覽器中通過(guò) Web 頁(yè)面輸入用戶名和密碼的認(rèn)證過(guò)程。多數(shù) ISP 號(hào)稱無(wú)需客戶端軟件,實(shí)際情況卻是:Windoze 下用戶可以順利通過(guò) Web 認(rèn)證上網(wǎng),但 Linux 用戶卻沒(méi)有這么幸運(yùn)。

分析原因

什么原因呢?解決問(wèn)題還需從分析認(rèn)證頁(yè)面入手,下面的分析主要針對(duì)我這里的情況。在 Mozilla 中打開認(rèn)證頁(yè)面后,沒(méi)有顯示任何內(nèi)容。仔細(xì)分析認(rèn)證頁(yè)面,發(fā)現(xiàn)認(rèn)證頁(yè)面采用 JavaScripts 編寫,并且是針對(duì) IE 編制的。IE 并未完全按照標(biāo)準(zhǔn)使用 JavaScripts。IE 對(duì) JavaScripts 做了一些擴(kuò)充,主要有以下幾項(xiàng):

* .cab files for download of binaries;
* document.all;
* element.innerHTML;
...

詳情請(qǐng)參閱 http://www.stopbadtherapy.com/standards.shtml

IE 對(duì) JavaScripts 的這些擴(kuò)充,Mozilla 是不支持的,實(shí)際上 Mozilla 對(duì)標(biāo)準(zhǔn) JavaScripts 的支持比 IE 好。所以,這些有 IE 特點(diǎn)的認(rèn)證頁(yè)面 Mozilla 等瀏覽器自然無(wú)法通過(guò)了。
從用戶瀏覽器的角度看,Web 認(rèn)證除了通過(guò) Web 頁(yè)面輸入用戶名和密碼外,還需要通過(guò) http 協(xié)議傳送客戶由 DHCP 獲得的 IP。有些 ISP 在用戶登錄到認(rèn)證頁(yè)面時(shí),由瀏覽器自動(dòng)下載 .cab 文件,然后執(zhí)行該文件獲得用戶的 IP,再傳給 Web Server。還有些 ISP 在用戶通過(guò)認(rèn)證后,會(huì)在客戶端彈出一個(gè)計(jì)時(shí)窗,定時(shí)向 ISP 發(fā)送 keep-alive 包。當(dāng)然,Web 認(rèn)證是一個(gè)比較新的方式,還沒(méi)有形成標(biāo)準(zhǔn),所以各提供商的方法也不盡相同,所謂各村有各村的高招,你那里的方法就很有可能與我的不同,但道理應(yīng)該是一樣的。根據(jù)以上的分析,可以看出 Linux 用戶自然不可能用非 IE 兼容的瀏覽器直接通過(guò)登錄 Web 認(rèn)證界面上網(wǎng)啦。

 解決方法

好了,問(wèn)題就在這些 Web 頁(yè)面使用 IE 方言的 JavaScripts 上,有幾種解決方法:

1。使用 Linux 下 IE 兼容的瀏覽器,有嗎?誰(shuí)知道請(qǐng)告訴我。
2。使用 wine + IE 的方法,有成功的嗎?大家共同分享。
3。如果將這些鳥語(yǔ)改為普通話,我們就可以用 Mozilla 等非 IE 瀏覽器通過(guò) Web 認(rèn)證方式上網(wǎng)了。
4。要求 ISP 提供支持 W3C 標(biāo)準(zhǔn)的認(rèn)證頁(yè)面。
5。分析 web 認(rèn)證的原理,編寫認(rèn)證程序。

最理想的方法四,可是我等不急,也不一定能等到,也許你比我幸運(yùn)。我采取第三種方法,對(duì)于方法三,你一定會(huì)問(wèn):認(rèn)證頁(yè)面在 Web Server 上,我無(wú)權(quán)修改,行不通。確實(shí)如此,這里有個(gè)變通的辦法:下載認(rèn)證頁(yè)面,按照 JavaScripts 標(biāo)準(zhǔn)修改并保存在本地,每次上網(wǎng)前用本地經(jīng)過(guò)修改的 Web 認(rèn)證頁(yè)面而非 Web Server 的認(rèn)證頁(yè)面就可以了。具體修改方法,參照 http://www.stopbadtherapy.com/standards.shtml 中的對(duì)照表,找出認(rèn)證頁(yè)面使用 IE 方言的 JavaScritps,根據(jù)對(duì)照表提供的修改建議對(duì)你的認(rèn)證頁(yè)面作出相應(yīng)修改。對(duì)于使用.cab 的認(rèn)證頁(yè)面,情況就比較復(fù)雜。需要分析這個(gè).cab 在你的 JavaScripts 中的用法,判斷它的功能,我這里是用它獲得本地 IP。所以,我在本地執(zhí)行腳本獲得 IP 來(lái)模擬這個(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)證頁(yè)面,這話有點(diǎn)多余,但有的用戶是在 Window$ 下調(diào)試的),訪問(wèn) ISP 的 WEB 認(rèn)證頁(yè)面時(shí),瀏覽器中沒(méi)有顯示任何內(nèi)容,根本無(wú)法輸入帳號(hào)和密碼,更談不上通過(guò)認(rèn)證。這難不倒咱 linuxer, 查看認(rèn)證頁(yè)面(/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)證頁(yè)面/queryPort.jsp?ip=你當(dāng)前的IP 。而 Mozilla 不支持它獲取 IP (PortalClient,是針對(duì)IE的,唉,這個(gè)程序編得太短視),看來(lái)問(wèn)題出在這里。既然如此,我們可以手工加上自己的 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

嗒嗒,登錄頁(yè)面出來(lái)啦!

趕快輸入帳號(hào),密碼,按登錄按鈕(期待中。。。)。

viva!!!

ISP 的首頁(yè)終于被揪出來(lái)啦,在終端中 ping www.gnu.org ,ping 通,沒(méi)問(wèn)題。

* 至此,在 Linux 下 web 認(rèn)證方式已經(jīng)完成。方法很簡(jiǎn)單,每次上網(wǎng)時(shí),在 mozilla 的地址欄中輸入:

http://你的ISP認(rèn)證服務(wù)器地址/queryPort.jsp?ip=你當(dāng)前的IP

登錄頁(yè)面出來(lái)后,和 IE 中的操作過(guò)程完全一樣。

* 當(dāng)然你可以把這些步驟寫成一個(gè)腳本,以后簡(jiǎn)單執(zhí)行腳本就可以了。

代碼如下:


  #!/bin/bash
  dhcpcd eth2
  phoenix http://61.61.61.61/queryPort.jsp?ip=`ifconfig eth2 grep inet sed 's/^ *//' sed 's/ /:/g' cut -f3 -d:` &


說(shuō)明:

eth2 是與 ADSL 聯(lián)的網(wǎng)卡名,根據(jù)你的實(shí)際情況填寫。
61.61.61.61 是我這 ISP 的認(rèn)證地址。
后面一段是獲得 eth2 的 ip 地址。
注意!一定要用非 IE 瀏覽器獲得調(diào)試認(rèn)證頁(yè)面,因?yàn)?IE 可以執(zhí)行認(rèn)證頁(yè)面的 JavaScripts,有些認(rèn)證過(guò)程實(shí)際上是執(zhí)行多個(gè)頁(yè)面完成的,IE 最后停留的頁(yè)面不一定是起始的認(rèn)證頁(yè)面,你有可能漏掉前面的重要信息,我這里就是這種情況。

另外一種方法

如果你對(duì)方法 3 不滿意,可以用方法 5,繼續(xù)分析 web 認(rèn)證的原理,編寫自己的認(rèn)證程序。其實(shí)搞清原理后,實(shí)現(xiàn)的方法更簡(jiǎn)單,更靈活,而且在 ISP 要求客戶端定時(shí)發(fā)送 keep-alive 包的情況下,也只能采取這種方法。我是這樣做的:

1。用網(wǎng)絡(luò)分析軟件(如:ethereal),抓取正常認(rèn)證過(guò)程的通訊包;

在 windoze 下,用 ethereal 抓包。注意抓包時(shí),除了 IE 不要啟動(dòng)其它產(chǎn)生網(wǎng)絡(luò)通訊的程序,以免產(chǎn)生干擾數(shù)據(jù);保存這些通訊包。

2。分析所抓包的內(nèi)容;

只要看一眼 web 認(rèn)證過(guò)程產(chǎn)生的通訊包,你就明白我為什么說(shuō)這種方法更簡(jiǎn)單了。簡(jiǎn)單講,web 認(rèn)證方式實(shí)際是客戶端用 http 協(xié)議向 ISP 發(fā)送用戶名、密碼和 IP 等內(nèi)容的過(guò)程。客戶端讀取認(rèn)證頁(yè)面;將填寫好認(rèn)證頁(yè)面表格發(fā)送到 ISP 的認(rèn)證服務(wù)器。過(guò)程就這么簡(jiǎn)單。

3。編寫生成這些包的程序;

用任意一個(gè)支持 http 協(xié)議的語(yǔ)言或工具,編寫向認(rèn)證服務(wù)器 POST 認(rèn)證頁(yè)面中 form 的程序即可,甚至讀取認(rèn)證頁(yè)面都不需要。我用 curl 和 python 各做了一個(gè)。如果你略微了解 http 協(xié)議,只要找到認(rèn)證頁(yè)面中向服務(wù)器 POST 用戶名、密碼等數(shù)據(jù)的 form,然后轉(zhuǎn)換為你采用語(yǔ)言的語(yǔ)法格式就可以了,根本不需要分析認(rèn)證頁(yè)面中繁雜的 Javascripts。對(duì)計(jì)時(shí)窗發(fā)出的 keep-alive 包也采用同樣的方法。

例子:

* 認(rèn)證頁(yè)面中的

代碼如下:


<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è)腳本:

bash/shell Code復(fù)制內(nèi)容到剪貼板

  1. #!/bin/bash   

  2. /etc/init.d/myiptables start    

  3. dhcpcd eth2    

  4. MYIP=`ifconfig eth2 grep inet sed 's/^ *//' sed 's/ /:/g' cut -f3 -d:`    

  5. echo $MYIP    

  6. UN=88888888    

  7. SERVER=61.61.61.61    

  8. curl --trace trace.txt -A 'Mozilla' -d "username=$UN&password=8888&localip=$MYIP&connectname=&connecttype=-1" http://$SERVER/secu/webLogin.jsp   

說(shuō)明:curl 是一個(gè)用 url 語(yǔ)法傳輸文件的命令行程序,支持 http,ftp 等協(xié)議,類似 wget。

上例中,curl 的命令行參數(shù) -A 指明客戶端的類型,這是服務(wù)器為了安全,需要指明。Mozilla 或 IE 都可以,我更愿意用 Mozilla。 -d 是必需的,表示用 POST 方法。-d 后的內(nèi)容就是用戶名、密碼 IP 地址等信息,根據(jù)你的認(rèn)證頁(yè)面中 form 的 input 項(xiàng)目填寫,內(nèi)容與其保持一致,參數(shù)間用 & 分開。后面是認(rèn)證頁(yè)面的地址。執(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

說(shuō)明:

python 是一個(gè)功能強(qiáng)大的腳本語(yǔ)言,與 Perl 類似。正如你看到的,它和 curl 完成同樣的工作,但更優(yōu)雅。這里要注意別漏掉'User-Agent' 和 'Content-Type' 內(nèi)容,我在這個(gè)上面浪費(fèi)了不少時(shí)間。其它與 curl 的說(shuō)明一樣。

最后,將下面內(nèi)容加到 crontab 中,保證每 5 分鐘向 ISP 發(fā)送一個(gè) keep-alive 包,模擬計(jì)時(shí)窗功能。

*/5 * * * * /home/zest/keepalive.py

方法 5 的總結(jié):

* 方法簡(jiǎn)單,思路清晰

* 適應(yīng)性廣

* 腳本實(shí)現(xiàn),脫離瀏覽器和圖形環(huán)境,更適于需要自動(dòng)登錄的環(huán)境(例如,自建的服務(wù)器)

到此,關(guān)于“在Linux下怎么通過(guò)WEB認(rèn)證方式上網(wǎng)”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實(shí)踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識(shí),請(qǐng)繼續(xù)關(guān)注創(chuàng)新互聯(lián)網(wǎng)站,小編會(huì)繼續(xù)努力為大家?guī)?lái)更多實(shí)用的文章!

網(wǎng)頁(yè)標(biāo)題:在Linux下怎么通過(guò)WEB認(rèn)證方式上網(wǎng)
分享網(wǎng)址:http://bm7419.com/article32/igejsc.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供響應(yīng)式網(wǎng)站、網(wǎng)站設(shè)計(jì)公司網(wǎng)頁(yè)設(shè)計(jì)公司、移動(dòng)網(wǎng)站建設(shè)商城網(wǎng)站、服務(wù)器托管

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

h5響應(yīng)式網(wǎng)站建設(shè)