![通过 Unix 脚本自动登录沃达丰社区 WiFi(Fon)](https://linux22.com/image/1486992/%E9%80%9A%E8%BF%87%20Unix%20%E8%84%9A%E6%9C%AC%E8%87%AA%E5%8A%A8%E7%99%BB%E5%BD%95%E6%B2%83%E8%BE%BE%E4%B8%B0%E7%A4%BE%E5%8C%BA%20WiFi%EF%BC%88Fon%EF%BC%89.png)
首先我要说我的问题类似于这个
我正在使用 Vodafone Community Fon AP,它经常断开连接。在我使用的 OS X 中,有一个名为 Captive Network Assistant 的工具可以连接到这些 AP。它可以完成这项工作,但不幸的是它不保留用户名/密码(我已向 Apple 提交了错误报告),因此每次我都必须再次输入它们。
我安装了 curl、lynx、wget,但我对这些工具不太熟悉。我可以通过 Macport 获取所需的一切。使用 Google Chrome,我识别出几个用于登录的 URL,但都不起作用。至少我无法让它们工作。以下是一些示例:
这是起始 URL:
这是实际应该进行登录的 URL:
http://192.168.6.1/logon?用户名=FON%2FVF_IT%2F<用户>%40<领域>&密码=6223980fe........93ea753ef4de‘
其中 USER 是用户名,DOMAIN 是电子邮件地址域。出于安全原因,我在密码字段中将一些数字改为带点的数字,这可能是我使用的密码的加密。
我尝试使用 wget/curl/lynx 传递凭据,但链接中总是返回一个带有“密码错误”的 URL。
有人有解决这个问题的方法吗?
答案1
我终于找到了解决方案。可能需要几个循环才能连接,但最终它会进行身份验证。它适用于 OS X El Capitan 10.11.4,任何针对以前 OS X 版本(如果需要)或 Linux 的调整都应该很容易。
请注意,它需要安装“wget”并将其放在 $PATH 中。
在登录时作为 OS X 用户代理启动脚本检查一下。脚本如下:
#!/bin/sh
######################################################################
#
# OS X Script to automatically reconnect to a Vodafone Community AP
# when the connection drops.
#
# It's designed to support to be launched as an OS X login agent
# logging to the console.
#
# Tested only on OS X EL Capitan. It should also run on Linux without
# many modifications
#
# Version 3.0
# Author: Michele Dall'Agata
#
# CHANGELOG:
#
# v3.0: All connection parameters are automatically retrieved from the
# Vodafone Station.
# Force the use of Vodafone-WiFi APs.
# Cleaner log.
# v2.2: Check after restarting the WiFi if the connection is up and continue
# in case. It happens quite often.
# v2.1: All references to the WiFi interface now correctly use $WIFI_IF.
# v2.0: Reorganized the logic.
# Added section OS X specific.
# Loop waiting for WiFi connecting after restarting.
# Added $WIFI_IF variable for WiFi interface.
# Check if it is a Vodafone Community AP.
# Fixed all wget commands.
# Complete although stripped logging. Now it's clearer which step
# is executed.
# v1.1: Restarts the WiFi interface.
# v1.0: first working skeleton. Hey, it did the job! :)
#
######################################################################
# $PATH should include the location where wget is installed
export PATH=$PATH:/opt/local/bin
# The Vodafone Country code. This is the code for Italy
COUNTRY=VF_IT
# The URL uses "%40" for "@". We do the same
USERNAME=<Your username>%40<Your domain>
PASSWORD=<Your Password>
# This will be visible in the Console app
# Set it to /dev/null if you don't want any log
LOGFILE=~/Library/Logs/Vodafone.log
# WiFi network interface. Option+Click on WiFI icon to get the one on
# your Mac. Change it accordingly.
WIFI_IF=en0
######################################################################
# For reference only. They get automatically set by the script
#
# MAC address of the Vodafone Station.
NASID=
# MAC address of your WiFi interface.
MACADDR=
# Vodafone Station (gateway) IP address.
IPADDR=
#######################################################################
# Begin Script
#######################################################################
# Log beginning of execution
echo >> $LOGFILE
echo $(date "+%d %b %H:%M:%S") Starting Vodafone Connection agent >> $LOGFILE
while [ true ]
do
# If the WiFi is switched off do nothing. Otherwise check if we are connected to
# a captive network
! ifconfig $WIFI_IF | grep "RUNNING" || \
wget -qO- http://captive.apple.com/hotspot-detect.html 2>&1 | \
grep 'Success' >> /dev/null
if [ $? != 0 ]; then
echo $(date "+%d %b %H:%M:%S") >> $LOGFILE
echo $(date "+%d %b %H:%M:%S") Connection is down. Reauthenticating >> $LOGFILE
# This is OS X specific
if [ $(uname) == "Darwin" ]; then
# Turn WiFi off and on in case the connection has got stuck (exclamation mark on WiFi icon)
echo $(date "+%d %b %H:%M:%S") Switching WiFi Off >> $LOGFILE
networksetup -setairportpower $WIFI_IF off
echo $(date "+%d %b %H:%M:%S") Switching WiFi On >> $LOGFILE
networksetup -setairportpower $WIFI_IF on
# We are here to reconnect to a Vodafone Community netwok.
networksetup -setairportnetwork $WIFI_IF Vodafone-WiFi
# Wait for the WiFi to connect to the router and get an IP address
while ! ifconfig $WIFI_IF | grep "inet " 2>&1 > /dev/null ; do
echo $(date "+%d %b %H:%M:%S") Waiting for WiFi to connect >> $LOGFILE
networksetup -setairportnetwork $WIFI_IF Vodafone-WiFi
sleep 1
done
sleep 2
The connection may be up already. Check and in case loop again
wget -qO- http://captive.apple.com/hotspot-detect.html 2>&1 | grep 'Success' > /dev/null && \
echo $(date "+%d %b %H:%M:%S") The connection is up and running\! >> $LOGFILE && \
continue
# This could be at the beginning of the loop but the connection was down
# so restarting the WiFi interface may help anyway.
# TODO: To check what happens if we use a different a different network
if [ $(networksetup -getairportnetwork $WIFI_IF | awk '{print $NF}') != "Vodafone-WiFi" ];
then
echo $(date "+%d %b %H:%M:%S") Not a Vodafone AP
sleep 60
continue
fi
fi
#
# if Captive Network Assistant app launches for some reason DNS doesn't work.
# Just kill it
pgrep "Captive Network Assistant" && echo $(date "+%d %b %H:%M:%S") Killed Captive Network Assistant.. \
$(killall -9 "Captive Network Assistant" 2>&1) >> $LOGFILE
# We can get all needed parameters from the returned URL.
# Grab them querying any IP number and store them in $IPPARM
IPPARM=$(wget -qO- --timeout=10 -t 1 8.8.8.8 2>&1 | grep loginVodafone | grep -i challenge | \
sed -e 's/\&/=/g' | awk -F= '{ print $7 " " $9 " " $13 " " $15}')
# Assign each value
read NASID IPADDR MACADDR CHALLENGE <<< $IPPARM
# If empty either the Captive Network Assistant deamon restored the connection or something went wrong.
# Loop again
if [ -z $CHALLENGE ]; then
echo $(date "+%d %b %H:%M:%S") The station returned no login URL. The connection may be up. \
>> $LOGFILE
else
# Kill it again...
pgrep "Captive Network Assistant" && echo $(date "+%d %b %H:%M:%S") Killed Captive Network Assistant.. \
$(killall -9 "Captive Network Assistant" 2>&1) >> $LOGFILE
echo $(date "+%d %b %H:%M:%S") Connecting to AP $IPADDR with BSSID $NASID >> $LOGFILE
wget -qO- --timeout=10 --keep-session-cookies \
--post-data "chooseCountry=$COUNTRY%2F&userFake=$USERNAME$&UserName=$COUNTRY%2F$USERNAME&Password=$PASSWORD&_rememberMe=on" \
"https://it.portal.vodafone-wifi.com/jcp/it?res=login&nasid=$NASID&uamip=$IPADDR&uamport=80&mac=$MACADDR&challenge=$CHALLENGE" \
2>&1 >> /dev/null
fi
# It may need some time to fully establish the connection?
sleep 3
# And kill it again...
pgrep "Captive Network Assistant" && echo $(date "+%d %b %H:%M:%S") Killed Captive Network Assistant.. \
$(killall -9 "Captive Network Assistant" 2>&1) >> $LOGFILE
# Log if the connection was re-established
(wget -qO- http://captive.apple.com/hotspot-detect.html 2>&1 | grep 'Success' > /dev/null && \
echo $(date "+%d %b %H:%M:%S") The connection is up and running\! >> $LOGFILE) || \
echo $(date "+%d %b %H:%M:%S") The connection is still down. Retrying >> $LOGFILE
else
# No need for more than 1s. When the connection is up it's just 1 HTTP query per loop.
sleep 1
fi
done