Автоматичне налаштування Wi-Fi в Debian

Я звик носити з собою власний ноутбук, постійно переключаючись між двома різними точками доступу до мережі інтернет: вдома та на роботі. З тиждень я мирився з тим, що необхідно щоразу перенастроювати параметри бездротового підключення. Використання сторонніх засобів для збереження та перенастроювання Wi-Fi підключення мене особливо не радувало, до того ж, моєю метою було ще й максимально зручне управління мережевими підключеннями як в графіці, так і в терміналі. Пам’ять нагадала мені, що подібна ситуація вже передбачена в файлі мережевих налаштувань /etc/network/interfaces. Документація вказувала на можливість передати право вибору налаштувань зовнішній програмі за допомогою директиви mapping. Таким чином, лишилось тільки написати скрипт, що вибере за мене доступну на даний момент бездротову мережу. При цьому сам файл interfaces набуде наступного вигляду:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
auto wlan0
mapping wlan0
	script /usr/local/sbin/wlan-detect.sh
	map OfficeAP wlan0-office
	map HomeAP wlan0-home
 
iface wlan0-home inet dhcp
	wpa-ssid HomeAP
	wpa-bssid 01:23:45:67:89:AB
	wpa-psk HomePassphrase
	wpa-key-mgmt WPA-PSK
	wpa-pairwise TKIP CCMP
	wpa-group TKIP CCMP
	wpa-proto WPA RSN
 
iface wlan0-office inet dhcp
	wpa-ssid OfficeAP
	wpa-bssid CD:EF:01:23:45:67
	wpa-psk OfficePassphrase
	wpa-key-mgmt WPA-PSK
	wpa-pairwise TKIP CCMP
	wpa-group TKIP CCMP
	wpa-proto WPA RSN

Як видно з файлу, для налаштування реального інтерфейсу wlan0 буде використаний один з “віртуальних” інтерфейсів wlan0-office чи wlan0-home. Директива mapping визначає зовнішню програму, яка повинна вирішити задачу про вибір мережевих налаштувань. Для цього їй буде передана назва інтерфейсу що буде використаний, а також пари “параметр-інтерфейс” (а їх може бути як завгодно багато) з директив map в порядку появи їх у файлі interfaces. В результаті програма має видати ім’я віртуального інтерфейсу, за яким і буде налаштовано реальний. Сам вибір логічно прив’язати до SSID точки доступу, що й було реалізовано. А ось і сам скрипт, який виконує цей вибір:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#!/bin/sh
 
IFACE="$1"
CTRL_SOCKET="/var/run/wpa_supplicant"
 
# We cannot perform AP scanning until interface is down. Bring up wlan interface
# with wpa_supplicant and wait a little.
wpa_supplicant -i $IFACE -C $CTRL_SOCKET &
PID=$!
sleep 5
 
SCAN_RESULT=`mktemp`
iwlist $IFACE scan > $SCAN_RESULT
 
# Simple check of scanning results. Script stops searching when first AP is
# found.
while read SSID IFACE_ALIAS ; do
	if ( grep "ESSID:\"$SSID\"" $SCAN_RESULT > /dev/null ) ; then
		echo $IFACE_ALIAS
		break
	fi
done
 
# Some cleanup before exit.
kill $PID
rm $SCAN_RESULT
 
exit 0

Цю ж статтю російською мовою в дещо скороченому вигляді можна прочитати на дружньому Wiki-проекті linuxoid.hostopia.com