View difference between Paste ID: vcVC9iL9 and dSvQS2iY
SHOW: | | - or go back to the newest paste.
1
#!/bin/bash
2
3
# 23/10/2013
4
# This script attempts to semi-automate / automate the wifi connection
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
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 version 1  http://pastebin.com/Pa90HBiU  01/06/2013
24
# 	very simple first version
25
# old version 2  http://pastebin.com/FzJnv5Nk  02/06/2013
26
#	minor additions
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
30
#	checking for empty saved files
31
# old version 4
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
#	connections if internet access is not made.  Can be used in
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
# cat, kill, ps, grep, xargs, iwconfig, dhclient, wpa_supplicant, curl.
44
#
45
# Copy, Distribute and Modify Freely.
46
#
47
48
49
########################################################################
50
######################## FUNCTIONS #####################################
51
52
function HELP (){
53
	HELP_MESSAGE="$1"
54
	if [ "$HELP_MESSAGE" ]; then
55
		printf "$HELP_MESSAGE"
56
	fi
57
	printf "Usage: $0 -i [INTERFACE] OR AND -f [CONF_FILE.wpa] -r (RANDOM_CONF_MODE)\n"
58
}
59
60
61
function CHECK_ARGS () {
62
	#
63
	# Define Globals
64
	#
65
	INET_AVAIL=0
66
	RANDOM_CONF_MODE=0
67
	RANDOM_FIRST_RUN=0
68
	CONF_FILE=""
69
	INT=""
70
71
	if [ -z "$1" ]; then
72
	HELP
73
	exit 1
74
	fi
75
76
	while getopts  "i:f:r" opt
77
		do
78
			case $opt in
79
				i ) INT=${OPTARG};;
80
				f ) CONF_FILE=${OPTARG};;
81
				r ) RANDOM_CONF_MODE=1;;
82
				\?) HELP
83
					exit 1;;
84
				* ) HELP
85
					exit 1;;
86
			esac
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
	#
100
	if [ -z "$INT" ]; then
101
		HELP
102
		exit 1
103
	fi
104
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
}
124
125
126
function PINGCHECK (){
127
	#
128-
	# Check for an internet connection using curl to download from a FQDN. 5 Second timeout.
128+
	# Check for an internet connection using curl to download from a 
129-
	# Ref: http://superuser.com/questions/545865/how-to-check-if-internet-connection-is-available-via-terminal/625888#625888
129+
	# FQDN. 5 Second timeout.
130
	# Ref: superuser.com/questions/545865/how-to-check-if-internet-\
131
	# connection-is-available-via-terminal/625888
132
	#
133
	printf "Checking for internet access...\n"
134
	curl --interface $INT -o /dev/null -m 5 -s http://www.google.com
135
	if [[ $? == 0 ]]; then
136
		INET_AVAIL=1
137
	else
138
		#
139
		# Check again for internet access
140
		#
141
		printf "Rechecking for internet access...\n"
142
		curl --interface $INT -o /dev/null -m 5 -s http://www.google.com
143
		if [[ $? == 0 ]]; then
144
			INET_AVAIL=1
145
		else
146
			INET_AVAIL=0
147
		fi
148
	fi
149
}
150
151
152-
	# Accepts a filename argument to read a saved file.  Also can search or use previous saved
152+
153-
	# wpa configuration files.  Will automatically bypass new config prompting if RANDOM_CONF_MODE
153+
154
	# Accepts a filename argument to read a saved file.  Also can search
155-
	# Filename checking involves testing file is greater than zero length and exists
155+
	# or use previous saved
156
	# wpa configuration files.  Will automatically bypass new config 
157
	# prompting if RANDOM_CONF_MODE
158
	# is being used.
159
	# Filename checking involves testing file is greater than zero 
160
	# length and exists
161
	# before writing the configuration to wpa_supplicant.conf
162
	#
163
164
	local CONF_FILE=$1
165
166
	if [ $RANDOM_CONF_MODE -eq 0 ]; then
167
		if [ -n "$CONF_FILE" ]; then
168
			if [ -s "$CONF_FILE" ]; then
169
				printf "File $CONF_FILE exists, proceeding to connect\n"
170
				WRITE_CONF "$CONF_FILE"
171
				exit 0
172
			else
173
				printf "File $CONF_FILE is invalid or does not exist\n"
174
				CONF_CREATE
175
				exit 0
176
			fi
177
		fi
178
	else
179
		if [ -n "$CONF_FILE" ]; then
180
			if [ -s "$CONF_FILE" ]; then
181
				WRITE_CONF "$CONF_FILE"
182
				exit 1
183
			else
184
				printf "File $CONF_FILE is invalid or does not exist\n"
185
				RANDOM_CONF
186
				exit 1
187
			fi
188
		else
189
			RANDOM_CONF
190
			exit 1
191
		fi
192
	fi
193
194
	#
195
	# Save and change IFS so spaces in file names are not interpreted as
196
	# separate lines in the array
197
	#
198-
	# ref:http://www.cyberciti.biz/tips/handling-filenames-with-spaces-in-bash.html
198+
199
	IFS=$'\n'
200
201
	#
202-
	# ref:http://serverfault.com/questions/354403/remove-path-from-find-command-output
202+
203
	# ref:http://www.cyberciti.biz/tips/handling-filenames-with-spaces-\
204
	# in-bash.html
205
	#
206
	# " -printf '%f\n' " removes path info from outputs
207
	#
208
	# ref:http://serverfault.com/questions/354403/remove-path-from-find\
209
	# -command-output
210
	#
211
	SAVED_LIST=($(find . -type f -name "*.wpa" -printf '%f\n'))
212
213
	#
214
	# restore ifs
215
	#
216
	IFS=$OLDIFS
217
218
	#
219
	# Tests for number of saved wifi connections, if none exit
220
	#
221
	if [ -z "${SAVED_LIST[0]}" ]; then
222
		printf "There are no previous saved wifi connections\n"
223
		#
224
		# Create new connection
225
		#
226
		CONF_CREATE
227
		exit 0
228
	fi
229-
	#Select one of the previous saved configurations to connect with or quit
229+
230
	#
231
	#PS3 Sets the prompt for the select statement below
232
	#
233
	PS3="Choose a previously saved wifi connection or 's' to skip: "
234
235
	#
236
	# Select one of the previous saved configurations to connect with or 
237
	# quit
238
	#
239
	select CONF_FILE in "${SAVED_LIST[@]}"; do
240
		#
241
		# Quit if selected number does not exist
242
		#
243
		if [ -z "$CONF_FILE" ] ; then
244
				printf "Skipping\n\n"
245
				PS3=""
246
				CONF_CREATE
247
				exit 0
248
		fi
249
		#
250
		# Quick check if file is greater than zero length and exists
251
		#
252
		if [ -s "$CONF_FILE" ]; then
253
			printf "File $CONF_FILE exists, proceeding to connect\n"
254
			PS3=""
255
			WRITE_CONF "$CONF_FILE"
256
			exit 0
257
			else
258
			printf "File $CONF_FILE is invalid or does not exist, proceeding to create a new configuration\n"
259
			PS3=""
260
			CONF_CREATE
261-
	# This function randomly select a previously saved config files, check for internet access and keep trying another
261+
262-
	# connections if internet access is not made.  If and internet connection is not found, it tries another
262+
263-
	# connection.  Could be used as a faiover by specifying -f as your initial preferred network.
263+
264
}
265
266
267
function RANDOM_CONF (){
268
	#
269-
	# Test to check if RANDOM_FIRST_RUN is 1.  If so then proceed to connect using the config file specified first.
269+
	# This function randomly select a previously saved config files, 
270
	# check for internet access and keep trying another
271
	# connections if internet access is not made.  If and internet 
272
	# connection is not found, it tries another
273
	# connection.  Could be used as a faiover by specifying -f as your 
274
	# initial preferred network.
275
	#
276
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
277+
278-
	# a internet connection.  If there is no connection then it go to the random config selection.
278+
279
	#
280
	# Test to check if RANDOM_FIRST_RUN is 1.  If so then proceed to 
281
	# connect using the config file specified first.
282
	#
283
	if [ $RANDOM_FIRST_RUN -eq 1 ]; then
284
		RANDOM_FIRST_RUN=0
285
		READ_SAVED "$CONF_FILE"
286
	fi
287
288
	#
289
	# Test if INET_AVAIL is 1, initial value is 0 and if connection is 
290
	# good then it is 1.  Used to loop and recheck for
291
	# a internet connection.  If there is no connection then it go to 
292
	# the random config selection.
293
	#
294
295
	if [ $INET_AVAIL -eq 1 ]; then
296
		#
297
		# Sleep for a random period of 600 to 900 seconds
298
		#
299
		sleep $(((RANDOM % 300)+600))
300
		PINGCHECK
301-
	# This is a user entry prompt function, used to create new config files.
301+
302
	else
303
		OLDIFS=$IFS
304
		IFS=$'\n'
305
		CONF_FILE=($(find . -type f -name "*.wpa" -printf '%f\n'|sort -R |tail -1))
306
		IFS=$OLDIFS
307
		READ_SAVED "$CONF_FILE"
308
	fi
309
	exit 1
310
}
311
312
313
function CONF_CREATE (){
314
	#
315
	# This is a user entry prompt function, used to create new config 
316
	# files.
317
	#
318
319
	#
320
	# Scans for wifi connections & isolates wifi AP name
321
	#
322
	eval LIST=( $(iwlist $INT scan 2>/dev/null | awk -F":" '/ESSID/{print $2}') )
323
324
	#
325
	#PS3 Sets the prompt for the select statement below
326
	#
327
	PS3="Choose a new ESSID to create a connection or 'q' to quit: "
328
329
	#
330
	# Tests for number of wifi connections, exits if none
331
	#
332
		if [ -z "${LIST[0]}" ]; then
333
			printf "No available wifi connection using $INT\n"
334
			exit 1
335
		fi
336
337
	#
338
	# Select from a LIST of scanned connections
339
	#
340
	select CONF_FILE in "${LIST[@]}"; do
341
342-
		# Append the CONF_FILE variable (ESSID) to .wpa to make a filename
342+
343-
		# for saved configs
343+
344
		#
345
		if [ -z "$CONF_FILE" ] ; then
346
				printf "Exiting\n"
347
				exit 0
348
		fi
349
350
		#
351
		# Get user input for passphrase no need to escape spaces
352
		#
353
		printf "Enter the passphrase for $CONF_FILE?\n"
354
		read "PASSPHRASE"
355
356
		#
357
		# Append the CONF_FILE variable (ESSID) to .wpa to make a 
358
		# filename for saved configs
359
		#
360
		FILENAME=$CONF_FILE".wpa"
361
362
		#
363
		# Run wpa_passphrase to generate a file for wpa_supplicant to
364
		# use, store it locally and in etc/wpa_supplicant.conf
365
		#
366
		printf "Running wpa_passphrase\n"
367
		wpa_passphrase "$CONF_FILE" "$PASSPHRASE" > "$FILENAME" | xargs
368
		#
369
		# Jump to WRITE_CONF function, append configuration filename
370
		# to CONF_FILE variable
371
		#
372
373
		PS3=""
374
		WRITE_CONF "$FILENAME"
375
		exit 1
376
	done
377
}
378
379
380
function WRITE_CONF (){
381
382
	local CONF_FILE=$1
383
	#
384
	# Copy local wpa_supplicant file to etc/wpa_supplicant.conf
385
	#
386
	printf "Writing new configuration file using $CONF_FILE\n"
387
	cat "$CONF_FILE">/etc/wpa_supplicant.conf | xargs
388
	#
389
	# Jump to connect function, pass on the ESSID variable for connection
390
	#
391
	CONNECT "$CONF_FILE"
392
	exit 1
393
}
394
395
396
function CONNECT (){
397
	#
398
	# Capture first incoming argument as SSID
399
	#
400
	local ESSID=$1
401
402
	#
403
	# Kill previous instances of wpa_supplicant to stop other instances
404
	# wpa_supplicant fighting several different AP's
405
	# Kill based on
406
	# ref: http://thegeekstuff.com/2011/10/grep-or-and-not-operators
407
	# and
408
	# http://stackoverflow.com/questions/3510673/find-and-kill-a-\
409
	# process-in-one-line-using-bash-and-regex
410
	#
411
	# Release dhcp ip's and bring down the interface
412
	#
413
	kill $(ps aux | grep -E '[w]pa_supplicant.*\'$INT'' |  awk '{print $2}') 2>/dev/null | xargs
414
	dhclient $INT -r
415
	ifconfig $INT down
416
417
	#
418
	# Assign new credentials to config file
419
	#
420
	iwconfig $INT mode managed essid "$ESSID"
421
	printf "Configured interface $INT; Config file is $ESSID\n"
422
	ifconfig $INT up
423
	printf "Interface $INT is up\n"
424
	wpa_supplicant -B -Dwext -i$INT -c/etc/wpa_supplicant.conf 2>/dev/null | xargs
425
	printf "wpa_supplicant running, sleeping for 15...\n"
426
427
	#
428
	# Wait to connect before asking for a ip address
429
	#
430
	sleep 15
431
	printf "Running dhclient\n"
432
	dhclient $INT
433
434
	#
435
	# Print current ip for interface to screen
436
	#
437
	ifconfig $INT | grep inet
438
439
	#
440
	# Check if internet is available and print status to screen
441
	#
442
	sleep 5
443
	PINGCHECK
444
	if [ $INET_AVAIL -eq 1 ]; then
445
		printf "Internet is available on this connection\n"
446
	else
447
		printf "Internet is unavailable on this connection\n"
448
	fi
449
450
	if [ $RANDOM_CONF_MODE -eq 1 ]; then
451-
# Check if RANDOM_CONF_MODE is selected and/or config file specified, routes to correct function set
451+
452
	fi
453
454
	exit 0
455
}
456
457
########################################################################
458
######################## START HERE ####################################
459
460
#
461
# Call check args function to check the command line argument supplied are valid.
462
#
463
CHECK_ARGS "$@"
464
465
#
466
# Check if RANDOM_CONF_MODE is selected and/or config file specified, 
467
# routes to correct function set
468
# with file name arguments or no arguments depending on what is specified.
469
#
470
if [ $RANDOM_CONF_MODE -eq 1 ]; then
471
	if [ "$CONF_FILE" ]; then
472
		RANDOM_FIRST_RUN=1
473
		RANDOM_CONF "$CONF_FILE"
474
	else
475
	RANDOM_CONF
476
	fi
477
else
478
	if [ "$CONF_FILE" ]; then
479
		READ_SAVED "$CONF_FILE"
480
	else
481
		READ_SAVED
482
	fi
483
fi
484
485
exit 0