SHOW:
|
|
- or go back to the newest paste.
| 1 | #!/bin/bash | |
| 2 | ||
| 3 | - | # http://pastebin.com/Pa90HBiU |
| 3 | + | # |
| 4 | - | # 01/06/2013 |
| 4 | + | # 08/06/2013 |
| 5 | # This script attempts to semi-automate the wifi connection process from | |
| 6 | # the command line. | |
| 7 | # It is intended to be used on a headless machine without the | |
| 8 | # requirement of typing several commands for a connection. | |
| 9 | # The script stores previous connection credentials in PLAINTEXT as | |
| 10 | # *.wpa files in the executed directory and in /etc/wpasupplicant.conf. | |
| 11 | # These .wpa files are used to connect to several different ap using | |
| 12 | # previously stored info. | |
| 13 | # Probably a good idea to stop and other network managing software while | |
| 14 | # running this script, also in testing wpa_supplicant does a pretty good | |
| 15 | # job of re-connecting a disassociated link automatically. | |
| 16 | # | |
| 17 | # Mainly created from a combination of scripts taken from theses two | |
| 18 | # sources: | |
| 19 | # http://www.backtrack-linux.org/forums/archive/index.php/t-3367.html | |
| 20 | # AND | |
| 21 | # http://www.linuxquestions.org/questions/linux-general-1/wifi-connect\ | |
| 22 | # -script-tested-in-ubuntu-772646/ | |
| 23 | # | |
| 24 | - | # old version http://pastebin.com/Pa90HBiU 01/06/2013 |
| 24 | + | # old version1 http://pastebin.com/Pa90HBiU 01/06/2013 |
| 25 | # old version2 http://pastebin.com/FzJnv5Nk 02/06/2013 | |
| 26 | # | |
| 27 | # Copy, Distribute and Modify Freely. | |
| 28 | # | |
| 29 | ||
| 30 | - | INT=$1 |
| 30 | + | |
| 31 | if [ -z "$1" ]; then | |
| 32 | printf "Usage: $0 -i [interface] OR AND -f [SAVED_FILE.wpa]\n" | |
| 33 | - | printf "Usage: $0 [interface]\n" |
| 33 | + | |
| 34 | fi | |
| 35 | ||
| 36 | while getopts "i:f:" opt | |
| 37 | do | |
| 38 | case $opt in | |
| 39 | i ) INT=${OPTARG};;
| |
| 40 | f ) ITEM=${OPTARG};;
| |
| 41 | \?) printf "Usage: $0 -i [interface] OR AND -f [SAVED_FILE.wpa]\n" | |
| 42 | exit;; | |
| 43 | * ) printf "Usage: $0 -i [interface] OR AND -f [SAVED_FILE.wpa]\n" | |
| 44 | exit;; | |
| 45 | - | function read_saved {
|
| 45 | + | esac |
| 46 | done | |
| 47 | - | # Search for previous wpa configuration files. |
| 47 | + | |
| 48 | # | |
| 49 | # check if root | |
| 50 | # | |
| 51 | if [ "$(id -u)" != "0" ]; then | |
| 52 | printf "This script must be run as root\n" 1>&2 | |
| 53 | exit | |
| 54 | fi | |
| 55 | ||
| 56 | # | |
| 57 | # check if interface is entered as command line argument | |
| 58 | # | |
| 59 | if [ -z "$INT" ]; then | |
| 60 | printf "Usage: $0 -i [interface] OR AND -f [SAVED_FILE.wpa]\n" | |
| 61 | exit | |
| 62 | fi | |
| 63 | ||
| 64 | ||
| 65 | # | |
| 66 | # Search for previous saved config files | |
| 67 | # | |
| 68 | function read_saved (){
| |
| 69 | # | |
| 70 | # Search or uses for previous wpa configuration files | |
| 71 | # Checks if command line argument -f [SAVED_FILE.wpa] is greater than zero length and exists | |
| 72 | # before writing the configiuration to wpa_supplicant.conf. Otherwise create a new | |
| 73 | # configuration. | |
| 74 | # | |
| 75 | if [ -n "$ITEM" ]; then | |
| 76 | if [ -s "$ITEM" ]; then | |
| 77 | printf "File $ITEM exists, proceeding to connect\n" | |
| 78 | write_conf $ITEM | |
| 79 | - | printf "There are no previous saved wifi connections\n\n" |
| 79 | + | else printf "File $ITEM is invalid or does not exist, proceeding to create a new configuration\n" |
| 80 | conf_create | |
| 81 | fi | |
| 82 | fi | |
| 83 | # | |
| 84 | # Save and change IFS so spaces in file names are not interpreted as | |
| 85 | # separate lines in the array | |
| 86 | # | |
| 87 | OLDIFS=$IFS | |
| 88 | IFS=$'\n' | |
| 89 | ||
| 90 | # | |
| 91 | # Read all file names into an array | |
| 92 | # ref:http://www.cyberciti.biz/tips/handling-filenames-with-spaces\ | |
| 93 | # -in-bash.html | |
| 94 | # | |
| 95 | # " -printf '%f\n' " removes path info from outputs | |
| 96 | # | |
| 97 | # ref:http://serverfault.com/questions/354403/remove-path-from-find\ | |
| 98 | # -command-output | |
| 99 | - | printf "Skipping\n" |
| 99 | + | |
| 100 | SAVED_LIST=($(find . -type f -name "*.wpa" -printf '%f\n')) | |
| 101 | ||
| 102 | # | |
| 103 | - | printf "$ITEM is selected\n" |
| 103 | + | |
| 104 | # | |
| 105 | IFS=$OLDIFS | |
| 106 | - | done |
| 106 | + | |
| 107 | ||
| 108 | # | |
| 109 | # Tests for number of saved wifi connections, if none exit | |
| 110 | # | |
| 111 | if [ -z "${SAVED_LIST[0]}" ]; then
| |
| 112 | printf "There are no previous saved wifi connections\n" | |
| 113 | # | |
| 114 | # Create new connection | |
| 115 | # | |
| 116 | conf_create | |
| 117 | fi | |
| 118 | ||
| 119 | # | |
| 120 | #PS3 Sets the prompt for the select statement below | |
| 121 | # | |
| 122 | PS3="Choose a previously saved wifi connection or 's' to skip: " | |
| 123 | ||
| 124 | # | |
| 125 | #Select one of the previous saved configurations to connect with or quit | |
| 126 | # | |
| 127 | select ITEM in "${SAVED_LIST[@]}"; do
| |
| 128 | # | |
| 129 | # Quit if selected number does not exist or alpha in entered | |
| 130 | # | |
| 131 | if [ -z "$ITEM" ] ; then | |
| 132 | printf "Skipping\n\n" | |
| 133 | conf_create | |
| 134 | fi | |
| 135 | # | |
| 136 | # Quick check if file is greater than zero length and exists | |
| 137 | # | |
| 138 | if [ -s "$ITEM" ]; then | |
| 139 | printf "File $ITEM exists, proceeding to connect\n" | |
| 140 | write_conf "$ITEM" | |
| 141 | else printf "File $ITEM is invalid or does not exist, proceeding to create a new configuration\n" | |
| 142 | conf_create | |
| 143 | fi | |
| 144 | done | |
| 145 | } | |
| 146 | ||
| 147 | ||
| 148 | function conf_create (){
| |
| 149 | # | |
| 150 | # Scans for wifi connections & isolates wifi AP name | |
| 151 | # | |
| 152 | eval LIST=( $(iwlist $INT scan 2>/dev/null | awk -F":" '/ESSID/{print $2}') )
| |
| 153 | ||
| 154 | # | |
| 155 | #PS3 Sets the prompt for the select statement below | |
| 156 | # | |
| 157 | PS3="Choose wifi connection or 'q' to quit: " | |
| 158 | ||
| 159 | # | |
| 160 | - | cat "$FILENAME">/etc/wpa_supplicant.conf | xargs |
| 160 | + | |
| 161 | - | printf "Creating new configuration using $ITEM\n" |
| 161 | + | |
| 162 | if [ -z "${LIST[0]}" ]; then
| |
| 163 | printf "No available wifi connection using $INT\n" | |
| 164 | - | # Jump to connect function, pass on the ESSID variable for connection |
| 164 | + | |
| 165 | fi | |
| 166 | - | connect $ITEM |
| 166 | + | |
| 167 | # | |
| 168 | # Select from a LIST of scanned connections | |
| 169 | # | |
| 170 | select ITEM in "${LIST[@]}"; do
| |
| 171 | ||
| 172 | # | |
| 173 | # Quit if selected number does not exist or alpha in entered | |
| 174 | # | |
| 175 | if [ -z "$ITEM" ] ; then | |
| 176 | printf "Exiting\n" | |
| 177 | exit | |
| 178 | fi | |
| 179 | ||
| 180 | # | |
| 181 | # Get user input for passphrase no need to escape spaces | |
| 182 | # | |
| 183 | printf "Enter the passphrase for $ITEM?\n" | |
| 184 | read "PASSPHRASE" | |
| 185 | ||
| 186 | # | |
| 187 | # Append the ITEM variable (ESSID) to .wpa to make a filename | |
| 188 | # for saved configs | |
| 189 | # | |
| 190 | FILENAME=$ITEM".wpa" | |
| 191 | ||
| 192 | # | |
| 193 | # Run wpa_passphrase to generate a file for wpa_supplicant to | |
| 194 | # use, store it locally and in etc/wpa_supplicant.conf | |
| 195 | # | |
| 196 | printf "Running wpa_passphrase\n" | |
| 197 | - | printf "Configured interface $INT; ESSID is $ESSID\n" |
| 197 | + | |
| 198 | # | |
| 199 | # Jump to write_conf function, append configuration filename | |
| 200 | # to ITEM varibale | |
| 201 | # | |
| 202 | ITEM="$FILENAME" | |
| 203 | write_conf | |
| 204 | done | |
| 205 | } | |
| 206 | ||
| 207 | function write_conf (){
| |
| 208 | # | |
| 209 | # Copy local wpa_supplicant file to etc/wpa_supplicant.conf | |
| 210 | # | |
| 211 | printf "Writing new configuration file using $ITEM\n" | |
| 212 | cat "$ITEM">/etc/wpa_supplicant.conf | xargs | |
| 213 | # | |
| 214 | # Jump to connect function, pass on the ESSID variable for connection | |
| 215 | # | |
| 216 | connect "$ITEM" | |
| 217 | } | |
| 218 | ||
| 219 | function connect (){
| |
| 220 | printf "Connecting using file $*\n" | |
| 221 | ||
| 222 | # | |
| 223 | # Capture incoming argument | |
| 224 | - | printf "It is recommended that you perform a \"airmon-ng check kill\" once to ensure that any other network managers do not interfere with the connection process\n" |
| 224 | + | |
| 225 | ESSID=$* | |
| 226 | ||
| 227 | # | |
| 228 | # Kill previous instances of wpa_supplicant to stop other instances | |
| 229 | # wpa_supplicant fighting several different AP's | |
| 230 | # Kill based on | |
| 231 | # ref: http://thegeekstuff.com/2011/10/grep-or-and-not-operators | |
| 232 | # and | |
| 233 | # http://stackoverflow.com/questions/3510673/find-and-kill-a-\ | |
| 234 | # process-in-one-line-using-bash-and-regex | |
| 235 | # | |
| 236 | # Release dhcp ip's and bring down the interface | |
| 237 | # | |
| 238 | kill $(ps aux | grep -E '[w]pa_supplicant.*\'$INT'' | awk '{print $2}') 2>/dev/null | xargs
| |
| 239 | dhclient $INT -r | |
| 240 | ifconfig $INT down | |
| 241 | ||
| 242 | # | |
| 243 | # Assign new credentials to interface | |
| 244 | # | |
| 245 | iwconfig $INT mode managed essid "$ESSID" | |
| 246 | printf "Configured interface $INT; Credential file is $ESSID\n" | |
| 247 | ifconfig $INT up | |
| 248 | printf "Interface $INT is up\n" | |
| 249 | wpa_supplicant -B -Dwext -i$INT -c/etc/wpa_supplicant.conf 2>/dev/null | xargs | |
| 250 | printf "wpa_supplicant running, sleeping for 15...\n" | |
| 251 | ||
| 252 | # | |
| 253 | # Wait to connect before asking for a ip address | |
| 254 | # | |
| 255 | sleep 15 | |
| 256 | printf "Running dhclient\n" | |
| 257 | dhclient $INT | |
| 258 | ||
| 259 | # | |
| 260 | # Show current ip for interface | |
| 261 | # | |
| 262 | ifconfig $INT | grep inet | |
| 263 | exit | |
| 264 | } | |
| 265 | ||
| 266 | function clean_slate (){
| |
| 267 | # | |
| 268 | # Optional Clean Slate commands, it is recommended that you perform | |
| 269 | # a "airmon-ng check kill" to ensure that any other network managers | |
| 270 | # do not intefere with the connection process | |
| 271 | # | |
| 272 | ||
| 273 | printf "It is recommended that you perform a \"airmon-ng check kill\" once to ensure that any other network managers do not interfere with the connection process\n\n" | |
| 274 | ||
| 275 | # | |
| 276 | # Untested, airmon-ng check kill works better here | |
| 277 | # | |
| 278 | # service network-manager stop 2>/dev/null >/dev/null | |
| 279 | # service avahi-daemon stop 2>/dev/null >/dev/null | |
| 280 | # sleep 10 | |
| 281 | # killall wpa_supplicant 2>/dev/null | |
| 282 | # ifconfig $INT up | |
| 283 | } | |
| 284 | ||
| 285 | # | |
| 286 | # Start here | |
| 287 | # | |
| 288 | clean_slate | |
| 289 | read_saved | |
| 290 | ||
| 291 | exit |