如何在不使用浏览器的情况下验证无线提供商的“开放”网络?


13

这种设置在购物中心和机场中似乎很常见。在加拿大西部,Shaw提供了这样的服务,并将其称为“ Shaw Open”。我很确定其他语言环境也可以从T-Mobile等提供商那里获得类似的服务。

从诸如手机之类的东西开始,并不是很复杂。连接到wifi热点无需身份验证,因为它是“开放”的,可供公众访问。但是在我使用浏览器并登录到ISP提供的特定网页之前,手机不会通过应用程序连接到网站或远程服务。

简单地说,我的问题是:如何从通常没有传统浏览器的设备上自动执行身份验证步骤?

在我的特定情况下,我配置了树莓派,该树莓派配置了我想在贸易展览会等上使用的软件。这些位置具有相同的“开放”热点。Raspi意味着自我约束。它只是做生意并与网站对话。但是此出站连接被ISP的“开放”连接阻止,因为我还没有完成该过程的浏览器部分。

假设我具有在特定提供商网络上执行此操作的凭据,那么如何在不要求打开与Pi的终端会话的情况下自动执行该过程的这一部分? 我什至可以在这里搜索使用哪种技术?


假设您的Pi具有Linux,是否已wget安装程序?
大卫·威尔金斯

1
您的问题不是真正关于Linux或Unix,它更适合于Super User。此外,是否有任何您不想在pi上安装浏览器的原因?例如,您始终可以使用简单的基于文本的命令行浏览器links2
terdon

@terdon只要Pi运行的是Linux或其他Unix变体,这个问题就完全在这里了。相反,我不认为Pi是SU定义的计算机(但我不确定,我从不了解该定义,也从未在任何地方写下它)。
吉尔斯(Gillles)“所以-别再作恶了”

@Gilles是的,它是话题,我没有投票关闭。我只是在暗示它可能更适合SU。是的,在那里欢迎您提出pi问题。
terdon

Answers:


12

解决诸如此类问题的关键是知道如何提出问题。我在Google上搜索了“如何访问Panera Bread wifi”,然后打开了这个宝石。

本文提供了一些可用于促进自动登录的脚本。我选择包括Panera Bread的示例,该示例利用了Python的Mechanize库。

该解决方案利用NetworkManager的dispatcher.d目录在特定网络接口出现故障时随时运行脚本。本文详细介绍了您将在此目录中放置的脚本/etc/NetworkManager/dispatch.d,名为07-autologin_openwifi。这是脚本:

#!/bin/bash
#------------------------------
# By Fahad Alduraibi
# Last update: June 12, 2012
# Version: 1.1
#------------------------------

export LC_ALL=C
LogFile="/var/log/07-WIFI_ACCESS.log"

# The parameters that get passed to the script are:
# $1 = The interface name ( eth0, wlan0 ...etc)
# $2 = Interface status ( "up" or "down" )

# Check if wireless status is up
# I have two wifi cards in my laptop, named "wlan0 and wlan1"
# so I use regular expression "wlan[01]" to match both of them.
if [[ "$1" =~ wlan[01] && $2 == "up" ]]; then

    # Get the network name from "iwconfig" or (can also locate the network based on IP or MAC address if needed)
    ESSID=$(/sbin/iwconfig $1 | grep ESSID | cut -d'"' -f2)

    # Record the date and time for debugging purposes only
    echo "[`date`] ESSID=($ESSID)" >> $LogFile

    # If the wireless name matches then run its python script
    if [[ "$ESSID" == "BCPL-PUBLIC-WIFI" ]]; then
        /usr/bin/python /myscripts/baltimore-county_library_wifi.py 1>> $LogFile 2>&1
    elif [[ "$ESSID" == "PANERA" ]]; then
        /usr/bin/python /myscripts/panera.py 1>> $LogFile 2>&1
    elif [[ "$ESSID" == "Nordstrom_Wi-Fi" ]]; then
        /usr/bin/python /myscripts/nordstrom.py 1>> $LogFile 2>&1
    #elif .... (you can add more open wifi here)

    fi
fi

#if [[ "$1" =~ wlan[01] && $2 == "down" ]]; then
    ##If you want to do somehting when the network is down
#fi

这是Panera面包的脚本panera.py

#------------------------------
# By Fahad Alduraibi
# Last update: June 12, 2012
# Version: 1.1
#------------------------------
import mechanize
import sys

br = mechanize.Browser()
br.set_handle_equiv(True)
#br.set_handle_gzip(True)
br.set_handle_redirect(True)
br.set_handle_referer(True)
br.set_handle_robots(False)
br.set_handle_refresh(mechanize._http.HTTPRefreshProcessor(), max_time=1)
br.addheaders = [('User-agent', 'Mozilla/5.0 (X11; Linux x86_64; rv:13.0) Gecko/20100101 Firefox/13.0')]

testURL = 'http://fadvisor.net/blog/'
response = br.open(testURL)

if response.geturl() == testURL:
  print "FAD: You are already logged in to Panera."
  sys.exit()

try:
  forms = mechanize.ParseResponse(response, backwards_compat=False)
except:
  print "FAD: Error in parsing forms, Am I already logged in to Panera?"
  sys.exit()

response.close

form = forms[0]
#print form
#print "----------------------------------- Login"
request = form.click()
response = mechanize.urlopen(request)
forms = mechanize.ParseResponse(response, backwards_compat=False)
response.close()

form = forms[0]
#print form
#print "----------------------------------- Validate"
#print
request = form.click()
response = mechanize.urlopen(request)
forms = mechanize.ParseResponse(response, backwards_compat=False)
response.close()

form = forms[0]
#print form
#print "----------------------------------- ConfirmLogin New"
#print
request = form.click()
response = mechanize.urlopen(request)
forms = mechanize.ParseResponse(response, backwards_compat=False)
response.close()

form = forms[0]
#print form
#print "----------------------------------- ConfirmLogin Validate"
#print
request = form.click()
response = mechanize.urlopen(request)
forms = mechanize.ParseResponse(response, backwards_compat=False)
response.close()

form = forms[0]
#print form
#print "----------------------------------- CompleteLogin New"
#print

request = form.click()
response = mechanize.urlopen(request)
forms = mechanize.ParseResponse(response, backwards_compat=False)
response.close()

form = forms[0]
#print form
#print "----------------------------------- HttpLoginRequest"
#print

request = form.click()
response = br.open(request)
#print response.read()

response.close()
print "--- Panera Done ---"

如果您对执行自动登录的其他方法感兴趣,建议您阅读整篇文章。该文章还有其他几个开放的WiFi网络,这些网络是为马里兰州巴尔的摩市编写的。


这可能是唯一的解决方案,不幸的是,它需要大量的反向工程来确定要为每个不同的提供者提交的URL和表单字段,这当然有其自身的挑战,而开发人员必须至少了解所有可能的提供者并具有第一手接触它们;在我的特定情况下不一定可行。我想那是我所能期待的最好的。当然,任何一家提供商的解决方案都可能在他们决定更新其Web身份验证表格后立即中断。
Octopus

1

根据身份验证的实现方式,您可能能够发送HTTP请求以获取访问权限。但是,这取决于特定实现的许多方面。

请记住,这些类型的身份验证已部署到位,以使自治系统不受限制,同时仅允许浏览器进行访问,而这正是您要设法规避的。

理想情况下,您会拥有一部电话,可以将其设置为wifi热点,并将Pi连接到该网络,以便您可以做任何想做的事,但这不是免费的。

TL; DR:乞eg不能成为选择者


1
如果通过浏览器完成,则必须使用HTTP,因此这确实是可能的。但是,由于没有用于这种身份验证(AFAIK)的协议或标准,因此您必须为每个提供程序实现一些功能。如果您想将其带到没有实现的地方,那将毫无用处。我会选择手机热点- 如果将手机连接到开放网络,它将是免费的。
goldilocks 2014年


1

如果您有第二个网络设备,则可以设置NAT转发。用手机或笔记本电脑连接到“内部”网络,并使RPi将连接转发到整个网络。然后使用笔记本电脑或手机上的浏览器进行身份验证。网络会看到您的RP​​i的外部MAC地址,并将其与经过身份验证的连接关联。

我通常使用便携式旅行路由器(旧版AirPort Express)连接到酒店互联网,然后可以将Chromecast和其他设备连接到该网络,而无需重新进行身份验证。

甚至更简单...如果您的网络设备是USB且可与便携式计算机一起使用,请将其连接至便携式计算机并登录网络。然后将其重新连接到RPi。它应该工作几个小时。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.