#!/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