wifi 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 && chmod 740 wifiwifi 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="wlp3s0"
DIR_CONFIG=/etc/sysconfig/wpa_supplicant
FILE_CONFIG_DEFAULT=/etc/sysconfig/ifconfig.wlan0
FILE_CONFIG_DIFF=$FILE_CONFIG_DEFAULT.diff
SSID=""
PSK=""
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"; }
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)"
}
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)"
}
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
}
readFILE_CONFIG() {
SSID=$(sed -n 's/"$//g;s/^.*ssid="//p' "$FILE_CONFIG")
PSK=$(sed -n 's/"$//g;s/^.*psk="//p' "$FILE_CONFIG")
}
wpaDisconnect() {
pgrep wpa_supplicant && killall wpa_supplicant &&
logValid "All wpa_supplicant processes killed." &&
return 0
}
wpaConnect() {
SSID="$1"
FILE_CONFIG="$DIR_CONFIG/$SSID"
if ! [[ -f "$FILE_CONFIG" ]]; then
logError "File $FILE_CONFIG not found!"
exit
fi
wpaUp
sleep 1
readFILE_CONFIG
wpaDisconnect
sleep 1
wpa_supplicant -B -i $INTERFACE -c "$FILE_CONFIG" &&
sleep 1 &&
for i in {1..20}; do
sleep 2
ping -c 3 christianimmanuel.de &&
logValid "Successfully connected to $FILE_CONFIG" &&
return 0
logError "Failed test $i of 20"
done
logError "Unable to connect to to $FILE_CONFIG"
echo
echo "Retry connecting? [Yn]"
read ret
if [[ "$ret" != "n" ]]; then
wpaConnect $SSID
return 0
fi
echo "Disable wifi? [Yn]"
read dis
[[ "$dis" != "n" ]] &&
wpaDown
}
wpaActive() {
wpa_cli status | sed -n "s/^ssid=//p"
}
wpaUp() { modprobe iwlwifi && ifup $IFNAME wlan0; }
wpaDown() { wpaDisconnect; ifdown $IFNAME wlan0; }
wpaList() {
sed -n 's/^.*ssid="\([^"]*\)"/\1/p' $DIR_CONFIG/*
}
wpaNew() {
SSID="$1"
PSK="$2"
[[ -z "$SSID" ]] &&
logError "Please provide the ssid." && exit
if [[ -z "$psk" ]]; then
echo -e "No password passed!\nDo you wish to Enter a password?\n[y|N]"
read -n1 check
if [[ "$check" -eq "y" ]]; then
read PSK
fi
fi
[[ -f "$DIR_CONFIG/$SSID" ]] &&
logError "Found duplicate: $DIR_CONFIG/$SSID" && exit;
FILE_CONFIG="$DIR_CONFIG/$SSID"
echo -e "network={" >> "$FILE_CONFIG"
echo -e "\tssid=\"$SSID\"" >> "$FILE_CONFIG"
if [[ -n "$PSK" ]]; then
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
}
########
### MAIN
case "$1" in
"scan")
wpaScan
;;
"new")
shift 1
wpaNew "$@"
;;
"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