#!/bin/bash
|
|
wpa_ret ( )
|
{
|
if [ $1 != "OK" ]
|
then
|
if [ $3 == 1 ]
|
then
|
wpa_cli remove_network $2>/dev/null
|
echo "wpa_cli command failed on $2"
|
fi
|
exit 1
|
fi
|
}
|
|
connect_ap ( )
|
{
|
#if [ $1 -eq 1 ]
|
#then
|
ssid=\""$2"\"
|
pw=\""$3"\"
|
declare -i scantimes=1
|
nw_no=$(wpa_cli add_network | sed '1d')
|
ret=$(wpa_cli set_network $nw_no ssid $ssid | sed '1d')
|
echo "Set ssid for nw $nw_no: $ret"
|
wpa_ret $ret $nw_no 1
|
if [ $5 == "WPA" -o $5 == "WPA2" ]
|
then
|
ret=$(wpa_cli set_network $nw_no psk $pw | sed '1d')
|
echo "Set PSK: $ret"
|
wpa_ret $ret $nw_no 1
|
elif [ $5 == "WEP40" -o $5 == "WEP128" -o $5 == "OPEN" ]
|
then
|
ret=$(wpa_cli set_network $nw_no key_mgmt NONE | sed '1d')
|
echo "Set Key-mgmt: $ret"
|
wpa_ret $ret $nw_no 1
|
ret=$(wpa_cli set_network $nw_no auth_alg OPEN | sed '1d')
|
echo "Set Aith-alg: $ret"
|
wpa_ret $ret $nw_no 1
|
if [ $5 != "OPEN" ]
|
then
|
ret=$(wpa_cli set_network $nw_no wep_key0 $pw | sed '1d')
|
echo "Set wep key: $ret"
|
wpa_ret $ret $nw_no 1
|
fi
|
fi
|
#echo "Set proto"
|
#ret=$(wpa_cli set_network $nw_no proto WPA | sed '1d')
|
#wpa_cli status #echo $ret
|
#wpa_ret $ret $nw_no 1
|
#echo "Set key_mgmt"
|
#ret=$(wpa_cli set_network $nw_no key_mgmt WPA-PSK | sed '1d')
|
#wpa_cli status #echo $ret
|
#wpa_ret $ret $nw_no 1
|
#echo "Set pairwise"
|
#ret=$(wpa_cli set_network $nw_no pairwise CCMP | sed '1d')
|
#wpa_cli status #echo $ret
|
#wpa_ret $ret $nw_no 1
|
#echo "Set group"
|
#ret=$(wpa_cli set_network $nw_no group CCMP | sed '1d')
|
#wpa_cli status #echo $ret
|
#wpa_ret $ret $nw_no 1
|
ret=$(wpa_cli enable_network $nw_no | sed '1d')
|
echo "Enable nw $nw_no: $ret"
|
wpa_ret $ret $nw_no 1
|
#echo "Connect"
|
#ret=$(wpa_cli reconnect | sed '1d')
|
#wpa_cli status #echo $ret
|
#wpa_ret $ret $nw_no 1
|
state=$(wpa_cli status -i $1 | grep wpa_state | sed 's/wpa_state=//g')
|
form_st="INACTIVE"
|
while [ $state != "COMPLETED" ]
|
do
|
if [ $form_st != $state ]
|
then
|
echo "Status: $state"
|
fi
|
if [ $state == "SCANNING" ]
|
then
|
sleep 1
|
elif [ $state == "DISCONNECTED" ]
|
then
|
if [ $scantimes <= $4]
|
then
|
echo "Connect"
|
ret=$(wpa_cli reconnect | sed '1d')
|
wpa_ret $ret $nw_no 1
|
$scantimes=$scantimes + 1
|
else
|
echo "exceed scan times=$scantimes"
|
fi
|
fi
|
form_st=$state
|
state=$(wpa_cli status -i $1 | grep wpa_state | sed 's/wpa_state=//g')
|
done
|
if [ $state == "COMPLETED" ]
|
then
|
echo "Connected and request for IP address"
|
dhclient -4 $1 >/dev/null
|
fi
|
#fi
|
}
|
|
if [ $# -eq 5 ]
|
then
|
echo "Scanning"
|
declare -i total_scantime=$4
|
for((i=1; i<=$4; i=i+1))
|
do
|
echo "scan loop:$i"
|
scan_st=$(wpa_cli scan -i $1)
|
total_scantime=total_scantime-1
|
sleep 2
|
result=$(wpa_cli scan_results -i $1 | grep -c $2)
|
if [ $result -eq 1 ]
|
then
|
echo "Target AP $2 is found."
|
break;
|
fi
|
done
|
if [ $result -eq 1 ]
|
then
|
connect_ap $1 $2 $3 $total_scantime $5
|
else
|
echo "Target ap is not found"
|
fi
|
|
|
elif [ $3 == "off" ]
|
then
|
echo "Disconnect AP"
|
dhclient -r $1 >/dev/null
|
dhclient -x >/dev/null
|
nw_no=$(wpa_cli list_network | grep CURRENT | awk '{print $1}')
|
echo "Disable network"
|
ret=$(wpa_cli disable_network $nw_no | sed '1d')
|
wpa_ret $ret $nw_no 1
|
echo "Remove network"
|
ret=$(wpa_cli remove_network $nw_no | sed '1d')
|
wpa_ret $ret $nw_no 0
|
else
|
echo "====================================================================================="
|
echo "manual scan & connect script"
|
echo "./scan_conn.sh <interface> <BSSID> <PW> <scan_times>"
|
echo "./scan_conn.sh <interface> <BSSID> off"
|
echo "====================================================================================="
|
fi
|