wifi.old Administration
Connect to wifi using wpa_supplicant
This script is not working properly
While hoping i could make a more secure connection
by verifying the router by its BSSID
i had to figure out that that BSSID is not a fixed value...
wget https://git.christianimmanuel.de/scripts/raw/Administration/wifi.old && chmod 740 wifi.oldwifi.old raw
#!/bin/bash
##########################################
### Connect to wifi using wpa_supplicant
### This script is not working properly
### While hoping i could make a more secure connection
### by verifying the router by its BSSID
### i had to figure out that that BSSID is not a fixed value...
INTERFACE="wlan0"
DIR_CONFIG=/etc/sysconfig/wpa_supplicant
FILE_CONFIG_DEFAULT=/etc/sysconfig/wpa_supplicant-wifi0.conf
FILE_CONFIG_DIFF=$FILE_CONFIG_DEFAULT.diff
logError() { echo -e "\e[0;31m$1\e[0m\n"; }
logValid() { echo -e "\e[0;32m$1\e[0m\n"; }
logInfo() { echo -e "\e[0;34m$1\e[0m\n"; }
wpaUp() { ifup $IFNAME; }
wpaDown() { ifdown $IFNAME; }
wpaList() {
sed -n 's/^.*ssid="\([^"]*\)"/\1/p' $DIR_CONFIG/*
}
readLINE() {
SSID="$( awk -F'\t' '{print $5}' <<< $LINE)"
SIGNAL="$( awk -F'\t' '{print $3}' <<< $LINE)"
FREQUENCY="$(awk -F'\t' '{print $2}' <<< $LINE)"
FLAGS="$( awk -F'\t' '{print $4}' <<< $LINE)"
BSSID="$( awk -F'\t' '{print $1}' <<< $LINE)"
NUMBER="$c)"
}
readFILE_CONFIG() {
SSID=$(sed -n 's/"$//g;s/^.*ssid="//p' $FILE_CONFIG)
BSSID=$(sed -n 's/^.*bssid=//p' $FILE_CONFIG)
PSK=$(sed -n 's/"$//g;s/^.*psk="//p' $FILE_CONFIG)
}
getConfigName() {
[[ -n "$PSK" ]] &&
sed "s/://g;s/^/BSSID_/g;s/$/.conf/g" <<< "$BSSID" &&
return 1
echo "$SSID"
}
getFileBySSID() {
for i in $(find $DIR_CONFIG -name "BSSID_*.conf"); do
grep -q "ssid=\"$SSID\"$" $i &&
FILE_CONFIG="$DIR_CONFIG/$(basename $i)" &&
return 1
done
}
getFileByINPUT() {
[[ -f $DIR_CONFIG/BSSID_$INPUT.conf ]] && FILE_CONFIG="$DIR_CONFIG/BSSID_$INPUT.conf" && return 1
[[ -f $INPUT ]] && FILE_CONFIG="$DIR_CONFIG/$(basename $INPUT)" && return 1
[[ -f $DIR_CONFIG/$INPUT ]] && FILE_CONFIG="$DIR_CONFIG/$INPUT" && return 1
[[ -f $DIR_CONFIG/$INPUT.conf ]] && FILE_CONFIG="$DIR_CONFIG/$INPUT.conf" && return 1
[[ -f $DIR_CONFIG/$(sed "s/://g;s/^/BSSID_/g" <<< "$INPUT").conf ]] &&
FILE_CONFIG="$DIR_CONFIG/$(sed "s/://g;s/^/BSSID_/g" <<< "$INPUT").conf" && return 1
SSID="$INPUT" getFileBySSID
[[ -z $FILE_CONFIG ]] &&
logError "Unable to find config file for \"$INPUT\" in $DIR_CONFIG.." &&
exit
}
checkConfigDuplicate() {
exitD() { logError "Found duplicate: $DIR_CONFIG/$(getConfigName)" && exit; }
[[ -f "$DIR_CONFIG/$(getConfigName)" ]] && exitD
for i in $(find . -name "BSSID_*.conf"); do
grep "ssid=\"$SSID\"$" $i && exitD
done
}
getScan() {
wpa_cli ping | grep -q "^PONG" ||
(wpaUp && sleep 3)
wpa_cli scan > /dev/null 2>&1
WIFIS="$(wpa_cli scan_results | tail -n +3)"
}
getBSSID() {
for i in {1..8}; do
getScan &&
grep -q "$SSID" <<< "$WIFIS" &&
BSSID="$(grep -m1 "$SSID" <<< "$WIFIS" |
awk -F'\t' '{print $1}' )" &&
logValid "Found BSSID for $SSID: $i of 8"
return 1
logError "Failed to find BSSID for $SSID: $i of 8"
sleep 0.2
done
logError "Unable to get BSSID so exiting gracefully."
}
getPSK() {
read PSK
}
resyncBssid() {
[[ -z "$WIFIS" ]] && getScan
checkbssid="$(grep -w "$SSID" <<< "$WIFIS" | awk '{print $1}')"
grep -w "$BSSID" <<< "$checkbssid" && return 1 ### needs to get fixed
[ "$BSSID" = "$checkbssid" ] && return 1
logError "SSID $SSID matches but BSSID doesn't! [ $BSSID != $checkbssid ]"
logError "Do you wish to update BSSID?"
echo -n "[Y|n]"
read -n1 check
[ "$check" = "n" ] && return 1
getFileBySSID
oldfile="$DIR_CONFIG/$FILE_CONFIG"
BSSID="$checkbssid"
FILE_CONFIG="$DIR_CONFIG/$(getConfigName)"
readFILE_CONFIG
mv $oldfile $FILE_CONFIG
sed -i "s/bssid=.*$/bssid=$BSSID/g" "$FILE_CONFIG"
logValid "created new config file: "$FILE_CONFIG"
"
}
wpaScan() {
getScan
tput rmam
c=0
while IFS=$'\n' read LINE; do
c=$((c+1))
readLINE
COLOR="6m"
[[ $((c%2)) -eq 0 ]] && COLOR="2m"
if [[ $(wc -c <<< $SSID) -lt 19 ]]; then
SSID="$SSID$(printf '%0.s ' $(seq 1 $((19-$(wc -c <<< $SSID))) ))"; fi
if [[ $(wc -c <<< $SIGNAL) -lt 4 ]]; then
SIGNAL="$SIGNAL$(printf '%0.s ' $(seq 1 $((4-$(wc -c <<< $SIGNAL))) ))"; fi
if [[ $(wc -c <<< $FREQUENCY) -lt 5 ]]; then
FREQUENCY="$FREQUENCY$(printf '%0.s ' $(seq 1 $((5-$(wc -c <<< $FREQUENCY))) ))"; fi
if [[ $(wc -c <<< $FLAGS) -lt 27 ]]; then
FLAGS="$FLAGS$(printf '%0.s ' $(seq 1 $((27-$(wc -c <<< $FLAGS))) ))"; fi
if [[ $(wc -c <<< $BSSID) -lt 18 ]]; then
BSSID="$BSSID$(printf '%0.s ' $(seq 1 $((18-$(wc -c <<< $BSSID))) ))"; fi
if [[ $(wc -c <<< $NUMBER) -lt 4 ]]; then
NUMBER="$NUMBER$(printf '%0.s ' $(seq 1 $((4-$(wc -c <<< $NUMBER))) ))"; fi
echo -e "\e[$COLOR $NUMBER $SSID $SIGNAL $FREQUENCY $BSSID $FLAGS \e[0m"
done <<< "$WIFIS"
unset IFS
tput smam
}
wpaNew() {
if [[ -z "$1" ]]; then
getBSSID
getPSK
else
SSID="$1"
PSK="$2"
[[ -n $PSK ]] && getBSSID
fi
[[ -z "$SSID" ]] &&
logError "SSID not set" && exit
[[ -n "$PSK" ]] &&
[[ -z "$BSSID" ]] &&
logError "BSSID not set" && exit
checkConfigDuplicate
FILE_CONFIG="$DIR_CONFIG/$(getConfigName)"
echo -e "network={" >> "$FILE_CONFIG"
echo -e "\tssid=\"$SSID\"" >> "$FILE_CONFIG"
if [[ -n "$PSK" ]]; then
echo -e "\tbssid=$BSSID" >> "$FILE_CONFIG"
echo -e "\tpsk=\"$PSK\"" >> "$FILE_CONFIG"
else
echo -e "\tkey_mgmt=NONE" >> "$FILE_CONFIG"
fi
echo "}" >> "$FILE_CONFIG"
logValid "Added $SSID to $FILE_CONFIG"
wpaConnect $SSID
}
wpaDisconnect() {
pgrep wpa_supplicant && killall wpa_supplicant &&
logValid "All wpa_supplicant processes killed." &&
return 1
}
wpaConnect() {
INPUT="$1"
getFileByINPUT
readFILE_CONFIG
resyncBssid
wpaDisconnect
wpa_supplicant -B -i $INTERFACE -c $FILE_CONFIG &&
for i in {1..4}; do
sleep $((5-$i))
ping -c 3 archlinux.org &&
logValid "Successfully connected to $FILE_CONFIG" &&
return 1
logError "Failed test $i of 4"
done
logError "Unable to connect to to $FILE_CONFIG"
}
checkAvailable() {
getScan
declare -a AVAILABLE
for FILE_CONFIG in $(find $DIR_CONFIG -type f); do
readFILE_CONFIG
resyncBssid
[[ -n $BSSID ]] && search="$BSSID" && aw=1
[[ -z $BSSID ]] && search="$SSID" && aw=5
LINE="$(grep -qw "$search" <<< "$(awk -v aw=$aw '{print $aw}' <<< "$WIFIS")" &&
grep -w "$search" <<< "$WIFIS")"
[[ -n $LINE ]] &&
readLINE && LINE="$SIGNAL $SSID $BSSID $FREQUENCY $FLAGS"
AVAILABLE+=("$LINE")
done
declare -a AVBYSPEED
IFS=$'\n' AVBYSPEED=($(sort <<<"${AVAILABLE[*]}"))
unset IFS
for i in "${AVBYSPEED[@]}"; do echo "#$i#"; done
}
wpaActive() {
wpa_cli status | sed -n "s/^ssid=//p"
}
########
### MAIN
case "$1" in
"scan")
wpaScan
;;
"new")
shift 1
wpaNew "$@"
;;
"check-available")
checkAvailable
;;
"up")
wpaUp
;;
"down")
wpaDown
;;
"connect")
shift 1
wpaConnect "$@"
;;
"disconnect")
wpaDisconnect
;;
"list")
wpaList
;;
"active")
wpaActive
;;
"remove")
wpaRemove
;;
*)
echo 'Enter [scan|list|new|remove|connect|active]'
;;
esac
#sed -n '1 p' <<< $WIFIS