Я звик носити з собою власний ноутбук, постійно переключаючись між двома різними точками доступу до мережі інтернет: вдома та на роботі. З тиждень я мирився з тим, що необхідно щоразу перенастроювати параметри бездротового підключення. Використання сторонніх засобів для збереження та перенастроювання 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