Скрипт для автоматической настройки Wi-Fi подключения в Debian

Материал из Linux Wiki
Перейти к навигацииПерейти к поиску

Во время постоянного переключения между различными точками доступа к беспроводной сети приходиться постоянно изменять настройки сетевого интерфейса, комментируя старые и внося новые параметры подключения. Для таких ситуаций в файле настроек сетевого интерфейса предусмотрена директива mapping, которая предусматривает передачу выбора сетевых настроек внешнему скрипту. Вот пример файла interfaces, использующий такую технику:

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

Таким образом, право выбора сетевой конфигурации переложено на скрипт /usr/local/sbin/wlan-detect.sh. В документации описано, что он должен принимать имя интерфейса как аргумент и пары "ключ-значение" из директивы map в порядке их следования. Поскольку в примере привязка к имени точки доступа, то следует следить, чтобы ключ в директиве map совпадал с параметром wpa-ssid соответстующего интерфейса. Сам скрипт приведен ниже:

#!/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

В качестве альтернативы данному скрипту можно использовать essidscan из пакета ifscheme.

См. также

  • interfaces(5)
  • wpa_supplicant(8)