Управление сетевыми интерфейсами осуществляется в Debian'е через файл /etc/network/interfaces и скрипт /etc/init.d/networking. Для нас важен файл настроек. Если заглянуть в его man, то можно найти замечательный параметр mapping. Эта опция даёт возможность создавать разные логические интерфейсы на одном физическом и автоматически выбирать нужный по определённым параметрам. Проще говоря - что-то типа профилей. Для выбора надо набросать небольшой скриптик и прописать условия.
Итак, к делу.
Условие определения логического интерфейса могут быть любые. Мне лично удобно по mac-адресу(логичнее, конечно, кажется по SSID, но мне этот вариант не подходит, потому что на всех, настроенных мной точках, я выставляю опцию SSID Broadcast в off, поэтому увидеть его стандартными средствами, не подключившись проблематично, но если у вас не так, то разумеется определение профиля по SSID более правильный выбор). Логика работы проста - при поднятии интерфейса, система сканирует сеть, смотрит, какая из знакомых ей точек доступна и подключается к ней. Основную работу за нас будет делать небольшой скрипт. Примеры таких скриптов можно глянуть в /usr/share/doc/ifupdown/examples/ . Там же лежат примеры настройки файла interfaces. У меня скрипт получился такой:
#!/bin/sh
#
# Auto wi-fi choise.
iface="$1"
ifconfig=$(which ifconfig)
iwlist=$(which iwlist)
which=""
# Проверка на случай, если wi-fi карта выключена.
if [ ! "$(grep $iface /proc/net/dev)" ]; then exit 1; fi
# Без этого не получится просканировать сеть.
$ifconfig $iface up
# Собственно выбор.
while read mac scheme; do
if [ "$which" ]; then continue; fi
if [ "$($iwlist $iface ap | grep $mac)" ]; then which="$scheme"; fi
done
# Передача выбора системным скриптам и выход.
if [ "$which" ]; then echo $which; exit 0; fi
exit 1
Как можно заметить, несмотря на простоту, в скрипте есть несколько особенностей. Первая - ему по умолчанию в качестве первого аргумента передаётся имя интерфейса. Вторая - он читает построчно заданные в настройках параметры. Третья - он должен вернуть выбранное логическое имя интерфейса и код выхода(0 - всё хорошо, работаем, 1 - ошибка, выходим). Если первое и последнее - понятно, то второе требует небольшого пояснения. Скрипту передаются параметры, заданные в interfaces. Последним параметром обязательно должно быть имя логического интерфейса. И всё, что делает скрипт, в конечном счёте направлено на то, чтобы это имя вернуть на stdout. Как видно, в моём случае я сканирую воздух, и, если попадается знакомый mac, тут же выбираю соответствующее ему имя. Если знакомых нет, разумеется подключение прерывается. Маки и имена указаны в interfaces. Для тех, кто будет использовать выборку по SSID, надо будет сделать что-то типа iwlist $iface scanning | grep $ssid.
И наконец, запись в interfaces:
mapping ath0Я для примера показал две точки, но их на самом деле может быть сколько угодно. Главное соблюдать формат записи - map mac-адрес логическое_имя. Разумеется, параметры для каждой из точек могут совершенно любыми.
script /usr/local/sbin/awfc.sh
map 11:22:33:44:55:66 ath0-home
map AA:BB:CC:DD:EE:FF ath0-tmp
allow-hotplug ath0
# Домашняя сетка
iface ath0-home inet dhcp
wireless-essid HomeNet
wpa-ssid HomeNet
wpa-psk *********
# моё любимое кафе с wi-fi
iface ath0-tmp inet dhcp
wireless-essid TMPNet
И последний штрих. Дело в том, что по умолчанию при загрузке /etc/init.d/networking стартует достаточно рано относительно других сервисов. Оно понятное дело нужно, когда у меня сервер со всякими sshd, apache и прочими радостями. Но на нетбуке это совершенно лишнее. А из-за такой "спешки" не успевают подгрузиться все нужные для работы выбирающего скрипта части. А именно, не инициализировался до конца интерфейс, поэтому команда iwlist не возвращала ожидаемого результата. Я решил это просто - двумя командами перенёс загрузку сети с ранних этапов на стандартные, вместе с основными частями системы:
# update-rc.d -f networking remove
# update-rc.d networking defaults
Всё. При загрузке, если я нахожусь в зоне действия знакомой сети, нетбук автоматом к ней подключится. Если я не выключал нетбук и перешёл от одной знакомой сети к другой, достаточно рестартануть сеть и всё будет отлично.
Именно за такие простые и удобные вещи я и люблю Linux вообще и Debian в частности.