View difference between Paste ID: dSvQS2iY and J229Gc1t
SHOW: | | - or go back to the newest paste.
1
#!/bin/bash
2
3-
# 12/06/2013
3+
# 23/10/2013
4-
# This script attempts to semi-automate the wifi connection process from
4+
# This script attempts to semi-automate / automate the wifi connection
5-
# the command line.
5+
# process from the command line.
6
# It is intended to be used on a headless machine without the
7
# requirement of typing several commands for a connection.
8
# The script stores previous connection credentials in PLAINTEXT as
9
# *.wpa files in the executed directory and in /etc/wpasupplicant.conf.
10-
# These .wpa files are used to connect to several different ap using
10+
# These .wpa files are used to connect to several different AP using
11
# previously stored info.
12
# Probably a good idea to stop and other network managing software while
13
# running this script, also in testing wpa_supplicant does a pretty good
14
# job of re-connecting a disassociated link automatically.
15
#
16
# Mainly created from a combination of scripts taken from theses two
17
# sources:
18
# http://www.backtrack-linux.org/forums/archive/index.php/t-3367.html
19
# AND
20
# http://www.linuxquestions.org/questions/linux-general-1/wifi-connect\
21
# -script-tested-in-ubuntu-772646/
22
#
23-
# old version1  http://pastebin.com/Pa90HBiU  01/06/2013
23+
# old version 1  http://pastebin.com/Pa90HBiU  01/06/2013
24
# 	very simple first version
25-
# old version2  http://pastebin.com/FzJnv5Nk  02/06/2013
25+
# old version 2  http://pastebin.com/FzJnv5Nk  02/06/2013
26
#	minor additions
27-
# old version3  http://pastebin.com/3mu1XT5Y  08/06/2013
27+
# old version 3  http://pastebin.com/3mu1XT5Y  08/06/2013
28
#	included ability to call up previous saved files from
29-
#	command line.  Some checking of command line parameters and 
29+
#	command line.  Some checking of command line parameters and
30
#	checking for empty saved files
31-
# current version 
31+
# old version 4
32-
#	Added exit retrurn values
32+
#	Added exit return values
33
# Current version 5
34
#	Removal of cleanslate function.  Capitalising of function names.
35
#	Renaming of some function names.
36
#	Addition of random_config to randomly select a previously saved
37
#	config files, check for internet access and keep trying another
38-
if [ -z "$1" ]; then
38+
#	connections if internet access is not made.  Can be used in
39-
	printf "Usage: $0 -i [interface] OR AND -f [SAVED_FILE.wpa]\n"
39+
#	conjunction with -f to initially select a conf_file of your choice.
40
#	Improved program feedback and internet access checking.
41
#
42
# This script uses the following commands: find, printf, iwlist, awk,
43-
while getopts  "i:f:" opt
43+
# cat, kill, ps, grep, xargs, iwconfig, dhclient, wpa_supplicant, curl.
44-
	do
44+
45-
		case $opt in
45+
46-
		i ) INT=${OPTARG};;
46+
47-
		f ) ITEM=${OPTARG};;
47+
48-
		\?) printf "Usage: $0 -i [interface] OR AND -f [SAVED_FILE.wpa]\n"
48+
49-
			exit 1;;
49+
########################################################################
50-
		* ) printf "Usage: $0 -i [interface] OR AND -f [SAVED_FILE.wpa]\n"
50+
######################## FUNCTIONS #####################################
51-
			exit 1;;
51+
52-
		esac
52+
function HELP (){
53
	HELP_MESSAGE="$1"
54
	if [ "$HELP_MESSAGE" ]; then
55
		printf "$HELP_MESSAGE"
56-
# check if root
56+
57
	printf "Usage: $0 -i [INTERFACE] OR AND -f [CONF_FILE.wpa] -r (RANDOM_CONF_MODE)\n"
58-
if [ "$(id -u)" != "0" ]; then
58+
59-
	printf "This script must be run as root\n" 1>&2
59+
60
61
function CHECK_ARGS () {
62
	#
63
	# Define Globals
64-
# check if interface is entered as command line argument
64+
65
	INET_AVAIL=0
66-
if [ -z "$INT" ]; then
66+
	RANDOM_CONF_MODE=0
67-
printf "Usage: $0 -i [interface] OR AND -f [SAVED_FILE.wpa]\n"
67+
	RANDOM_FIRST_RUN=0
68-
exit 1
68+
	CONF_FILE=""
69
	INT=""
70
71
	if [ -z "$1" ]; then
72
	HELP
73-
# Search for previous saved config files
73+
74
	fi
75-
function read_saved (){
75+
76
	while getopts  "i:f:r" opt
77-
	# Search or uses for previous wpa configuration files
77+
		do
78-
	# Checks if command line argument -f [SAVED_FILE.wpa] is greater than zero length and exists
78+
			case $opt in
79-
	# before writing the configiuration to wpa_supplicant.conf.  Otherwise create a new
79+
				i ) INT=${OPTARG};;
80-
	# configuration.
80+
				f ) CONF_FILE=${OPTARG};;
81
				r ) RANDOM_CONF_MODE=1;;
82-
	if [ -n "$ITEM" ]; then
82+
				\?) HELP
83-
		if [ -s "$ITEM" ]; then
83+
					exit 1;;
84-
			printf "File $ITEM exists, proceeding to connect\n"
84+
				* ) HELP
85-
			write_conf $ITEM
85+
					exit 1;;
86-
		else 	printf "File $ITEM is invalid or does not exist, proceeding to create a new configuration\n"
86+
			esac
87-
			conf_create
87+
		done
88
89
	#
90
	# check if root
91
	#
92
	if [ "$(id -u)" != "0" ]; then
93
		HELP "This script must be run as root\n"
94
		exit 1
95
	fi
96
97
	#
98
	# check if interface is entered as command line argument
99-
	# ref:http://www.cyberciti.biz/tips/handling-filenames-with-spaces\
99+
100-
	# -in-bash.html
100+
	if [ -z "$INT" ]; then
101
		HELP
102
		exit 1
103
	fi
104-
	# ref:http://serverfault.com/questions/354403/remove-path-from-find\
104+
105-
	# -command-output
105+
106
	# Check if interface entered exists
107
	#
108
	if [ ! -e /sys/class/net/$INT ]; then
109
		HELP "Network Interface $INT does not exist\n"
110
		exit 1
111
	fi
112
113
	#
114
	# If random mode selected, check if wpa files are available
115
	#
116
	if [ $RANDOM_CONF_MODE -eq 1 ]; then
117
		local WPA_FILES=$(find . -type f -name "*.wpa" | wc -l)
118
		if [ "$WPA_FILES" -eq 0  ]; then
119
			HELP "No *.wpa files exist for RANDOM_CONF_MODE\n"
120
			exit 1
121
		fi
122
	fi
123-
		conf_create
123+
124
125
126
function PINGCHECK (){
127
	#
128
	# Check for an internet connection using curl to download from a FQDN. 5 Second timeout.
129
	# Ref: http://superuser.com/questions/545865/how-to-check-if-internet-connection-is-available-via-terminal/625888#625888
130
	#
131
	printf "Checking for internet access...\n"
132-
#Select one of the previous saved configurations to connect with or quit
132+
	curl --interface $INT -o /dev/null -m 5 -s http://www.google.com
133
	if [[ $? == 0 ]]; then
134-
select ITEM in "${SAVED_LIST[@]}"; do
134+
		INET_AVAIL=1
135
	else
136-
	# Quit if selected number does not exist or alpha in entered
136+
137
		# Check again for internet access
138-
	if [ -z "$ITEM" ] ; then
138+
139-
			printf "Skipping\n\n"
139+
		printf "Rechecking for internet access...\n"
140-
			conf_create
140+
		curl --interface $INT -o /dev/null -m 5 -s http://www.google.com
141
		if [[ $? == 0 ]]; then
142
			INET_AVAIL=1
143-
	# Quick check if file is greater than zero length and exists
143+
		else
144
			INET_AVAIL=0
145-
	if [ -s "$ITEM" ]; then
145+
146-
                        printf "File $ITEM exists, proceeding to connect\n"
146+
147-
                        write_conf "$ITEM"
147+
148-
                else    printf "File $ITEM is invalid or does not exist, proceeding to create a new configuration\n"
148+
149-
			conf_create
149+
150
function READ_SAVED (){
151
	#
152
	# Accepts a filename argument to read a saved file.  Also can search or use previous saved
153
	# wpa configuration files.  Will automatically bypass new config prompting if RANDOM_CONF_MODE
154
	# is being used.
155-
function conf_create (){
155+
	# Filename checking involves testing file is greater than zero length and exists
156
	# before writing the configuration to wpa_supplicant.conf
157
	#
158
159
	local CONF_FILE=$1
160
161
	if [ $RANDOM_CONF_MODE -eq 0 ]; then
162
		if [ -n "$CONF_FILE" ]; then
163
			if [ -s "$CONF_FILE" ]; then
164-
	PS3="Choose wifi connection or 'q' to quit: "
164+
				printf "File $CONF_FILE exists, proceeding to connect\n"
165
				WRITE_CONF "$CONF_FILE"
166
				exit 0
167
			else
168
				printf "File $CONF_FILE is invalid or does not exist\n"
169
				CONF_CREATE
170
				exit 0
171
			fi
172
		fi
173
	else
174
		if [ -n "$CONF_FILE" ]; then
175
			if [ -s "$CONF_FILE" ]; then
176
				WRITE_CONF "$CONF_FILE"
177-
	select ITEM in "${LIST[@]}"; do
177+
				exit 1
178
			else
179
				printf "File $CONF_FILE is invalid or does not exist\n"
180
				RANDOM_CONF
181
				exit 1
182-
		if [ -z "$ITEM" ] ; then
182+
			fi
183
		else
184
			RANDOM_CONF
185
			exit 1
186
		fi
187
	fi
188
189
	#
190-
		printf "Enter the passphrase for $ITEM?\n"
190+
191
	# separate lines in the array
192
	#
193
	OLDIFS=$IFS
194-
		# Append the ITEM variable (ESSID) to .wpa to make a filename
194+
195
196
	#
197-
		FILENAME=$ITEM".wpa"
197+
198
	# ref:http://www.cyberciti.biz/tips/handling-filenames-with-spaces-in-bash.html
199
	#
200
	# " -printf '%f\n' " removes path info from outputs
201
	#
202
	# ref:http://serverfault.com/questions/354403/remove-path-from-find-command-output
203
	#
204-
		wpa_passphrase "$ITEM" "$PASSPHRASE" > "$FILENAME" | xargs
204+
205
206-
		# Jump to write_conf function, append configuration filename
206+
207-
		# to ITEM varibale
207+
208
	#
209-
		ITEM="$FILENAME"
209+
210-
		write_conf
210+
211
	#
212
	# Tests for number of saved wifi connections, if none exit
213
	#
214-
function write_conf (){
214+
215
		printf "There are no previous saved wifi connections\n"
216
		#
217
		# Create new connection
218-
	printf "Writing new configuration file using $ITEM\n"
218+
219-
	cat "$ITEM">/etc/wpa_supplicant.conf | xargs
219+
		CONF_CREATE
220
		exit 0
221
	fi
222
223-
	connect "$ITEM"
223+
224
	#PS3 Sets the prompt for the select statement below
225
	#
226-
function connect (){
226+
227-
	printf "Connecting using file $*\n"
227+
228
	#
229
	#Select one of the previous saved configurations to connect with or quit
230-
	# Capture incoming argument
230+
231
	select CONF_FILE in "${SAVED_LIST[@]}"; do
232-
	ESSID=$*
232+
233
		# Quit if selected number does not exist
234
		#
235
		if [ -z "$CONF_FILE" ] ; then
236
				printf "Skipping\n\n"
237
				PS3=""
238
				CONF_CREATE
239
				exit 0
240
		fi
241
		#
242
		# Quick check if file is greater than zero length and exists
243
		#
244
		if [ -s "$CONF_FILE" ]; then
245
			printf "File $CONF_FILE exists, proceeding to connect\n"
246
			PS3=""
247
			WRITE_CONF "$CONF_FILE"
248
			exit 0
249
			else
250-
	# Assign new credentials to interface
250+
			printf "File $CONF_FILE is invalid or does not exist, proceeding to create a new configuration\n"
251
			PS3=""
252
			CONF_CREATE
253-
	printf "Configured interface $INT; Credential file is $ESSID\n"
253+
			exit 0
254
		fi
255
	done
256
}
257
258
259
function RANDOM_CONF (){
260
	#
261
	# This function randomly select a previously saved config files, check for internet access and keep trying another
262
	# connections if internet access is not made.  If and internet connection is not found, it tries another
263
	# connection.  Could be used as a faiover by specifying -f as your initial preferred network.
264
	#
265
266
	local CONF_FILE=$1
267-
	# Show current ip for interface
267+
268
	#
269
	# Test to check if RANDOM_FIRST_RUN is 1.  If so then proceed to connect using the config file specified first.
270-
exit 0
270+
271
	if [ $RANDOM_FIRST_RUN -eq 1 ]; then
272
		RANDOM_FIRST_RUN=0
273-
function clean_slate (){
273+
		READ_SAVED "$CONF_FILE"
274
	fi
275-
	# Optional Clean Slate commands, it is recommended that you perform
275+
276-
	# a "airmon-ng check kill" to ensure that any other network managers
276+
277-
	# do not interfere with the connection process
277+
	# Test if INET_AVAIL is 1, initial value is 0 and if connection is good then it is 1.  Used to loop and recheck for
278
	# a internet connection.  If there is no connection then it go to the random config selection.
279
	#
280-
	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"
280+
281
	if [ $INET_AVAIL -eq 1 ]; then
282
		#
283-
	# Untested, airmon-ng check kill works better here
283+
		# Sleep for a random period of 600 to 900 seconds
284
		#
285-
	#	service network-manager stop 2>/dev/null >/dev/null
285+
		sleep $(((RANDOM % 300)+600))
286-
	#	service avahi-daemon stop 2>/dev/null >/dev/null
286+
		PINGCHECK
287-
	#	sleep 10
287+
		RANDOM_CONF
288-
	#	killall wpa_supplicant 2>/dev/null
288+
	else
289-
	#	ifconfig $INT up
289+
		OLDIFS=$IFS
290
		IFS=$'\n'
291
		CONF_FILE=($(find . -type f -name "*.wpa" -printf '%f\n'|sort -R |tail -1))
292
		IFS=$OLDIFS
293-
# Start here
293+
		READ_SAVED "$CONF_FILE"
294
	fi
295-
clean_slate
295+
296-
read_saved
296+
297
298
299
function CONF_CREATE (){
300
	#
301
	# This is a user entry prompt function, used to create new config files.
302
	#
303
304
	#
305
	# Scans for wifi connections & isolates wifi AP name
306
	#
307
	eval LIST=( $(iwlist $INT scan 2>/dev/null | awk -F":" '/ESSID/{print $2}') )
308
309
	#
310
	#PS3 Sets the prompt for the select statement below
311
	#
312
	PS3="Choose a new ESSID to create a connection or 'q' to quit: "
313
314
	#
315
	# Tests for number of wifi connections, exits if none
316
	#
317
		if [ -z "${LIST[0]}" ]; then
318
			printf "No available wifi connection using $INT\n"
319
			exit 1
320
		fi
321
322
	#
323
	# Select from a LIST of scanned connections
324
	#
325
	select CONF_FILE in "${LIST[@]}"; do
326
327
		#
328
		# Quit if selected number does not exist or alpha in entered
329
		#
330
		if [ -z "$CONF_FILE" ] ; then
331
				printf "Exiting\n"
332
				exit 0
333
		fi
334
335
		#
336
		# Get user input for passphrase no need to escape spaces
337
		#
338
		printf "Enter the passphrase for $CONF_FILE?\n"
339
		read "PASSPHRASE"
340
341
		#
342
		# Append the CONF_FILE variable (ESSID) to .wpa to make a filename
343
		# for saved configs
344
		#
345
		FILENAME=$CONF_FILE".wpa"
346
347
		#
348
		# Run wpa_passphrase to generate a file for wpa_supplicant to
349
		# use, store it locally and in etc/wpa_supplicant.conf
350
		#
351
		printf "Running wpa_passphrase\n"
352
		wpa_passphrase "$CONF_FILE" "$PASSPHRASE" > "$FILENAME" | xargs
353
		#
354
		# Jump to WRITE_CONF function, append configuration filename
355
		# to CONF_FILE variable
356
		#
357
358
		PS3=""
359
		WRITE_CONF "$FILENAME"
360
		exit 1
361
	done
362
}
363
364
365
function WRITE_CONF (){
366
367
	local CONF_FILE=$1
368
	#
369
	# Copy local wpa_supplicant file to etc/wpa_supplicant.conf
370
	#
371
	printf "Writing new configuration file using $CONF_FILE\n"
372
	cat "$CONF_FILE">/etc/wpa_supplicant.conf | xargs
373
	#
374
	# Jump to connect function, pass on the ESSID variable for connection
375
	#
376
	CONNECT "$CONF_FILE"
377
	exit 1
378
}
379
380
381
function CONNECT (){
382
	#
383
	# Capture first incoming argument as SSID
384
	#
385
	local ESSID=$1
386
387
	#
388
	# Kill previous instances of wpa_supplicant to stop other instances
389
	# wpa_supplicant fighting several different AP's
390
	# Kill based on
391
	# ref: http://thegeekstuff.com/2011/10/grep-or-and-not-operators
392
	# and
393
	# http://stackoverflow.com/questions/3510673/find-and-kill-a-\
394
	# process-in-one-line-using-bash-and-regex
395
	#
396
	# Release dhcp ip's and bring down the interface
397
	#
398
	kill $(ps aux | grep -E '[w]pa_supplicant.*\'$INT'' |  awk '{print $2}') 2>/dev/null | xargs
399
	dhclient $INT -r
400
	ifconfig $INT down
401
402
	#
403
	# Assign new credentials to config file
404
	#
405
	iwconfig $INT mode managed essid "$ESSID"
406
	printf "Configured interface $INT; Config file is $ESSID\n"
407
	ifconfig $INT up
408
	printf "Interface $INT is up\n"
409
	wpa_supplicant -B -Dwext -i$INT -c/etc/wpa_supplicant.conf 2>/dev/null | xargs
410
	printf "wpa_supplicant running, sleeping for 15...\n"
411
412
	#
413
	# Wait to connect before asking for a ip address
414
	#
415
	sleep 15
416
	printf "Running dhclient\n"
417
	dhclient $INT
418
419
	#
420
	# Print current ip for interface to screen
421
	#
422
	ifconfig $INT | grep inet
423
424
	#
425
	# Check if internet is available and print status to screen
426
	#
427
	sleep 5
428
	PINGCHECK
429
	if [ $INET_AVAIL -eq 1 ]; then
430
		printf "Internet is available on this connection\n"
431
	else
432
		printf "Internet is unavailable on this connection\n"
433
	fi
434
435
	if [ $RANDOM_CONF_MODE -eq 1 ]; then
436
	RANDOM_CONF
437
	fi
438
439
	exit 0
440
}
441
442
########################################################################
443
######################## START HERE ####################################
444
445
#
446
# Call check args function to check the command line argument supplied are valid.
447
#
448
CHECK_ARGS "$@"
449
450
#
451
# Check if RANDOM_CONF_MODE is selected and/or config file specified, routes to correct function set
452
# with file name arguments or no arguments depending on what is specified.
453
#
454
if [ $RANDOM_CONF_MODE -eq 1 ]; then
455
	if [ "$CONF_FILE" ]; then
456
		RANDOM_FIRST_RUN=1
457
		RANDOM_CONF "$CONF_FILE"
458
	else
459
	RANDOM_CONF
460
	fi
461
else
462
	if [ "$CONF_FILE" ]; then
463
		READ_SAVED "$CONF_FILE"
464
	else
465
		READ_SAVED
466
	fi
467
fi
468
469
exit 0