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