SHOW:
|
|
- or go back to the newest paste.
1 | #!/bin/bash | |
2 | ||
3 | - | # |
3 | + | # http://pastebin.com/58r3agpt |
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 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 | ||
31 | if [ -z "$1" ]; then | |
32 | printf "Usage: $0 -i [interface] OR AND -f [SAVED_FILE.wpa]\n" | |
33 | exit | |
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 | esac | |
46 | done | |
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 | 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 | # | |
100 | SAVED_LIST=($(find . -type f -name "*.wpa" -printf '%f\n')) | |
101 | ||
102 | # | |
103 | # restore ifs | |
104 | # | |
105 | IFS=$OLDIFS | |
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 | # Tests for number of wifi connections, exits if none | |
161 | # | |
162 | if [ -z "${LIST[0]}" ]; then | |
163 | printf "No available wifi connection using $INT\n" | |
164 | exit | |
165 | fi | |
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 | wpa_passphrase "$ITEM" "$PASSPHRASE" > "$FILENAME" | xargs | |
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 | # | |
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 |
270 | + | # do not interfere 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 |