Script to connect to a wifi AP, if we got a key in our database, use it

We got many keys for some wifi APs around, so we put them in a delimited text file like:
ap8599:5537801570
sd6980:5202140314
wq0858:5953230520
now, when we are around, we want a script that we can tell: “connect to ap6980 if you see it around, if you
need a key, take it from the text file”. Called without arguments, it scans all available networks, and tries to
connect to all of the ones that we have a key or that are open.
This is our connection script:
#!/bin/bash
ap=$@
i=wlan0
en=0
#——————————————————————————————————————
# Scan for wireless networks, and pretty print the quality, the essid, and if we require encryption
#—————————————————————————————————————–
scanw () {
i=$1
( ifconfig $i up
iwlist $i scan | egrep -i ‘essid|freq|qual|encr’ |nawk ‘ORS=NR%4?” “:”n”‘| tr -s ‘ ‘| while read l;do
AP=`echo “$l “|awk ‘{s=substr($0,index($0,”ESSID:”) +7);print substr(s,1,index (s,”””)-1)}’`
EN=`echo “$l “|awk ‘{s=substr($0,index($0,”Encryption key:”)+15);print substr(s,1,index (s,” “)-1)}’`
QU=`echo “$l “|awk ‘{s=substr($0,index($0,”Quality=”)+8);print substr(s,1,index (s,”/”)-1)}’`
K=`grep “^$AP” keys.txt| awk -F’:’ ‘{ print $2 }’`
echo “$QU:$EN:$AP:$i: $K”
done
) | sort -n
}
#—————————————————————————————————————–
# Connect to the accespoint determined by the “$ap” variable
#—————————————————————————————————————–
conn(){
L=`grep -i “$ap” ~/keys.txt| head -1`
C=`echo -n $L | wc -c`
indb=1
if [ $C -lt 1 ];then
40/433
# echo “————- WARNING: AP $ap not found in database”
indb=0
fi
S=`grep “$ap” /tmp/scan.$$|wc -c`
if [ $S -lt 1 ];then
echo “————- ERROR: AP $ap is not in range, cannot connect”
exit 1
fi
if [ $indb -eq 1 ];then
#—if we found an accesspoint in our database work with it
AP=`echo $L | awk -F’:’ ‘{ print $1 }’`
K=`echo $L | awk -F’:’ ‘{ print $2 }’`
echo “————- Connecting to $AP with key $K”
iwconfig $i mode managed key $K essid “$AP” rate auto
else
AP=`grep “$ap” /tmp/scan.$$|awk -F’:’ ‘{ print $3 }’`
en=`grep “$AP” /tmp/scan.$$|awk -F’:’ ‘{ print $2 }’`
if [ $en == “off” ];then
echo “————- Connecting to $AP without key”
iwconfig $i mode managed key off essid “$AP” rate auto
else
echo “———— ERROR: Encryption needed for $AP but i don’t have the key”
return 1
fi
fi
x=0
echo -n “————- Associating with $AP”
while [ $x -lt 10 ];do
A=`iwconfig $i | grep -i ‘Not-Associated’|wc -c`
if [ ${A} -eq 0 ];then
echo “”;echo “————- Associated to $AP !!!”
dhclient -q -r $i
dhclient $i
exit 0
else
echo -n “.”
fi
sleep 1
x=`echo “$x + 1” | bc`
done
echo “”;echo “————- ERROR: Could not associate”
}
#——————————————————————————————————————-
# Connect to any accesspoint we can sniff
#——————————————————————————————————————-
auto () {
cat /tmp/scan.$$ | awk -F’:’ ‘{ print $3 }’ |while read ap;do
echo “———- trying to connect to $ap”
conn $ap
done
}
#——————————————————————————————————————-
# Main
41/433
#——————————————————————————————————————-
ifconfig -a | egrep -i ‘mon|wlan’ | awk ‘{ print $1 }’ |while read i;do airmon-ng stop $i; done > /dev/null 2>&1
ifconfig $i down
ifconfig $i up
scanw $i > /tmp/scan.$$
cat /tmp/scan.$$
if [ $# -lt 1 ];then
echo “——– WARNING: no Accesspoint specified, will try to connect to the ones i see alive”
auto
else
conn
fi
rm /tmp/scan.$$
Scan for wireless accesspoints, parse the output
so, iwlist throws its output in different order depending of the wifi nic, so we need to scan and parse, to see 3 columns:
signal strength: encryption needed: ESSID
27:on:CASA
27:on:AP1133
30:on:CC5763
32:on:XX1330
36:off:gg54g
So, we wrote a script called “scan” that loops to all wlan interfaces and scans for APs.
#!/bin/bash
ifconfig -a |grep -i wlan | awk ‘{ print $1 }’|while read i;do
echo “#—- scanning on $i”
( ifconfig $i up
iwlist $i scan | egrep -i ‘essid|freq|qual|encr’ |nawk ‘ORS=NR%4?” “:”n”‘| tr -s ‘ ‘| while read l;do
AP=`echo “$l “|awk ‘{s=substr($0,index($0,”ESSID:”) +7);print substr(s,1,index (s,”””)-1)}’`
EN=`echo “$l “|awk ‘{s=substr($0,index($0,”Encryption key:”)+15);print substr(s,1,index (s,” “)-1)}’`
QU=`echo “$l “|awk ‘{s=substr($0,index($0,”Quality=”)+8);print substr(s,1,index (s,”/”)-1)}’`
echo “$QU:$EN:$AP”
done
) | sort -n
done
42/433

Leave a Reply

Your email address will not be published. Required fields are marked *