04.06.2010 07:26

cppmmНастройка атоматического выбора wi-fi сети в Debian.

Есть у меня одна замечательная вещь - Asus EeePC. И, так как тут имеется wi-fi карта, не пользоваться услугами беспроводной связи просто грех. Но хорошо, когда сеть одна. А что, если их много и надо в одном месте включать одну, в другом другую? И при этом всякие графические монструозные комбайны ставить не хочется. Как быть? Настроить имеющиеся в Debian'е инструменты работы с сетью. Это на самом деле намного проще, чем может показаться на первый взгляд.
Управление сетевыми интерфейсами осуществляется в Debian'е через файл /etc/network/interfaces и скрипт /etc/init.d/networking. Для нас важен файл настроек. Если заглянуть в его man, то можно найти замечательный параметр mapping. Эта опция даёт возможность создавать разные логические интерфейсы на одном физическом и автоматически выбирать нужный по определённым параметрам. Проще говоря - что-то типа профилей. Для выбора надо набросать небольшой скриптик и прописать условия.
Итак, к делу.

Условие определения логического интерфейса могут быть любые. Мне лично удобно по mac-адресу(логичнее, конечно, кажется по SSID, но мне этот вариант не подходит, потому что на всех, настроенных мной точках, я выставляю опцию SSID Broadcast в off, поэтому увидеть его стандартными средствами, не подключившись проблематично, но если у вас не так, то разумеется определение профиля по SSID более правильный выбор). Логика работы проста - при поднятии интерфейса, система сканирует сеть, смотрит, какая из знакомых ей точек доступна и подключается к ней. Основную работу за нас будет делать небольшой скрипт. Примеры таких скриптов можно глянуть в /usr/share/doc/ifupdown/examples/ . Там же лежат примеры настройки файла interfaces. У меня скрипт получился такой:

 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#!/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:
 1
2
3
4
5
6
7
8
9
10
11
12
13
14
    mapping ath0
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



Я для примера показал две точки, но их на самом деле может быть сколько угодно. Главное соблюдать формат записи - map mac-адрес логическое_имя. Разумеется, параметры для каждой из точек могут совершенно любыми.
И последний штрих. Дело в том, что по умолчанию при загрузке /etc/init.d/networking стартует достаточно рано относительно других сервисов. Оно понятное дело нужно, когда у меня сервер со всякими sshd, apache и прочими радостями. Но на нетбуке это совершенно лишнее. А из-за такой "спешки" не успевают подгрузиться все нужные для работы выбирающего скрипта части. А именно, не инициализировался до конца интерфейс, поэтому команда iwlist не возвращала ожидаемого результата. Я решил это просто - двумя командами перенёс загрузку сети с ранних этапов на стандартные, вместе с основными частями системы:

# update-rc.d -f networking remove
# update-rc.d networking defaults


Всё. При загрузке, если я нахожусь в зоне действия знакомой сети, нетбук автоматом к ней подключится. Если я не выключал нетбук и перешёл от одной знакомой сети к другой, достаточно рестартануть сеть и всё будет отлично.
Именно за такие простые и удобные вещи я и люблю Linux вообще и Debian в частности.


Тэги: debian interfaces Linux network
+ 9 -
Похожие Поделиться

dfx 04.06.2010 08:33 #
Щас прибегут убунтоводы и скажут, что это не айс и через жопу %)
cppmm 04.06.2010 08:45 #
Конечно. Проще несколько километров мышкой намотать и нажать пару десятков кнопочек. Кто ж спорит? :)
lwilis 04.06.2010 09:29 #
Вообще с постом согласен. Хорошее простое решение. Но, глядя объективно, nm умеет находить новые сетки вокруг себя. И пытается восстановить связь при потере оной (Все это с переменным успехом, но все-таки). Так что... it depends в общем.
dfx 04.06.2010 09:38 #
А ещё этот nm умеет глючить отлично. Зачем зависеть от какой-то проги далеко не самой надёжной, когда можно всё сделать по-надежному и с гарантией? Новую сеть добавить - дело 30 секунд. Зато ничего вдруг не отвалится просто так и будет работать хоть где.
Вот ты настроил свою сеть в гноме/kde/etc, пользуешься. Упали иксы, не поднимаются. Полез в виртуальный терминал. Загуглить бы, а сети-то нету.. NM управляется только из гуя. И будешь сидеть, настраивать сеть полчаса... :)
lwilis 04.06.2010 09:45 #
Уважаемый, вы как-то очень бегло прочитали мой коммент и не уловили основную суть.
В остальном, что касается меня, то я не юзаю nm и, оказавшись без иксов, вполне способен сказать нечто из серии:
/usr/sbin/wpa_supplicant -Dwext -iwlan0 -c/etc/wpa_supplicant.conf -B
/sbin/dhclient -nw wlan0
dfx 04.06.2010 09:51 #
Ну и тем более, зачем тогда NM, если можно один раз настроить всё, чтобы работало везде и всегда? :)
lwilis 04.06.2010 09:52 #
Скажем так, пользователи бывают разные, также как и фломастеры.
dfx 04.06.2010 10:34 #
Ну так и пост не для всех, имхо.. :)
Username 04.06.2010 10:36 #
NM управляется только из гуя

знание матчасти поражает.
dfx 04.06.2010 11:05 #
Знание матчасти не пригодится тому, кто решил юзать NM, т.к. он изначально расчитан на людей, не знающих матчасти, как раз чтобы избавить их от знания этой самой мат.части.
И да... с матчастью у меня может и не всё гладко, но ни в одном из юзаных мною дистров я не нашёл как рулить NM'ом без гуя в дефолтной установке. может и есть какие-то дополнительные пакеты или финты ушами, но это не меняет ситуации. Я поставил NM, который так волшебно всё разруливает. А оказывается, чтобы юзать его без гуя - надо ещё и матчасть учить. Уж лучше разобраться с конфигом interfaces один раз и не париться.
И если уж юзать менеджеры подобные - то тогда wicd, там хоть консольный клиент есть.
Username 04.06.2010 11:07 #
Там вон пониже коммент для тебя
dfx 04.06.2010 11:16 #
Ага.. что примечательно - консольный клиент только "разрабатывается" после стольки-то лет...
Собрать всё воедино - это конечно хорошо. Но собрать так,чтобы всё работало всегда и везде. За последний год этот NM не раз показывал,насколько он "хорошо" собрал.
Да, последние релизы стали заметно лучше. Но, блин, через столько времени наконец сделать нормально - это пипец. Сейчас заработало, в следующем релизе снова сломают. И метайся то и дело - толи точка доступа тупит, толи забыл что-то, толи NM лажает... Да нафига? Я понимаю, если в инет выходишь каждый день с нового места через новое соединение... В остальных случаях NM - просто лишнее слабое звено. Да удобно, да красиво. И дай бог, чтобы оно действительно стало тем, что ты в нём видишь. Хотя бы через год. Но пока это всего лишь набор костылей, нифига не нативно прикрученных.
lwilis 04.06.2010 15:23 #
через столько времени наконец сделать нормально
Вы так говорите, как будто лично с разработчкиками контракт подписали, а они все дедлайны просрали.
cppmm 04.06.2010 10:40 #
Поддерживаю.
Мой опыт общения с nm сводился зачастую к попытке чего-нить настроить, неудаче и удалении сабжа нафиг из системы. :)
Задумка у nm хороша, но реализация просто мегаотвратительна. Имхо, этот продукт неюзабелен в принципе.
А с interfaces я стал разбираться, потому что это как бы изкоробочное решение, а не надстройка-костыль над системой.
Говорят, ещё есть wicd, но мне его пробовать не доводилось. А теперь уже и не нужно. :)
dukowski 05.06.2010 10:45 #
Ну, не обязательно. У меня во времена ubuntu 8.10 nm ни в какую не хотел подключаться к сети, и только прописка конфиг. ручками помогла. С тех пор так и осталось, хотя nm в lucid уже работает на отлично
bosha 04.06.2010 09:32 #
Вот. Спасибо. Ты сделал то, что мне было лень делать. Теперь можно wpa-supplicant удалять =>
cppmm 04.06.2010 10:41 #
Всегда пожалуйста. :)
Это и есть OpenSource - сделал что-то, поделись с другими.
bosha 04.06.2010 12:39 #
Мне просто было жутко лень это сделать. Как-то и wpa работал, но выпилить его хотелось.
Username 04.06.2010 11:06 #
Так как пошли пинки в сторону NM у Ъ-линуксоидов, попробую вот что высказать.

1. Скрипт весьма полезен, я бы попросил автора покурить в сторону выбора сети без перезагрузки сети, было бы круто вообще.
2. Выбираем любую доступную сеть (что примечательно, NM умеет хранить историю сетей).



Добавляем галочку "Подключать автоматически".



Ну и конечно, это же очень сложно.

3. Нетворкманагером можно управлять из консоли. Но зачем? Для просмотра статуса соединения удобно пользовать программку nm-tool.

36932339.th.png

Насколько мне известно, в данный момент разрабатывается cnetworkmanager - консольный клиент для NM, в Федоре привычно он уже есть, в убунту (по крайней мере в lucid) не завезли. Я им пользовался, и скажу, что это удобно.

К чему я это все говорю. Посмотрите, какой зоопарк развели в линуксе со звуком - написали всяких там прослоек, у разрабов потом крышу сносит. А ведь надо предусмотреть, установил ли Вася Пупкин, считающий себя Ъ пульсаудио или нет. То же самое из сетью. Вы должны быть благодарны проекту NetworkManager, который собирает всё управление сетью в себе, а не разбрасывает это по полочкам и кучкам. Это полезно и удобно. Хотите консоли - блять, настройте PPPoE через chap-secrets, имея под рукой только маны. После этого вы поймете, почему эта гуевина находится в вашем дистрибутиве. Я написал это тебе, dfx.
Username 04.06.2010 11:08 #
И да, если кого-то интересует как управлять nm без cnetworkmanager'а, отвечу - через dbus. Например, так.
dfx 04.06.2010 11:17 #
Ну да. Давай и плеером через dbus управлять и рабочие столы переключать через него же... а фигли? удобней же, чем один раз конфиг настроить...
dicson 04.06.2010 11:25 #
вообще спор ниочем... хорошо что есть nm и хорошо что конфиги еще не отменили.на домашнем компе нет nm, на нетбуке есть(мало ли в кафе зайти),но на нетбуке домашняя вафля поднимается из конфигов(мне так понятнее). главное выбор есть
other.bigmouse 04.06.2010 11:35 #
NM нужен не только для wifi, у меня его основное предназначение - руление hspda-модемом, с чем он прекрасно и справляется. А если он умеет еще и wifi и lan, то зачем лишние телодвижения?
cppmm 04.06.2010 11:48 #
Встроенные средства тоже умеют и wi-fi и простую сеть. Так зачем лишние телодвижения? ;)
Shtsh 04.06.2010 12:07 #
как, собственно, и hspda модем :)
cppmm 04.06.2010 12:27 #
Вполне возможно, между прочим. Тут вот люди рассказывают душераздирающие истории о муках настройки PPPoE, который отлично настраивается без всяких костылей. Лично мне с такими модемами не приходилось работать, поэтому точно сказать не могу, но по моему опыту, иногда в базовой системе имеется столько возможностей, что поражаешься её универсальности.
Shtsh 04.06.2010 12:30 #
у меня hspda модем :)
Для работы нужно следующее:
usb_modeswitch для включения режима модема (большинство детектится как cd-rom + картридер)
comgt для того, чтобы ввести pin-код
затем можно создавать ppp-соединение (через wvdial или сразу ppp). Кстати, если использовать wvdial, то можно обойтись и без comgt
cppmm 04.06.2010 12:40 #
Хех.
pre-up опция interfaces для usb_modeswitch, Она же для ввода pin-кода. Потом с помощью параметра up устанавливаем соединение, используя pppd или wvdial и радуемся жизни. :)
А я-то думал, там что-то страшное. :)
other.bigmouse 04.06.2010 12:41 #
И перед этим нужно искурить 5 кг манов, когда в NM + modem-manager все работает (тыкнул мышкой - выбрал своего оператора)
Shtsh 04.06.2010 12:45 #
ну, мне интересно разбираться как оно делается. Да и не всегда есть возможность тыкнуть мышкой.

В общем, как обычно про фломастеры.
cppmm 04.06.2010 12:57 #
ну, мне интересно разбираться как оно делается.

И да!
cppmm 04.06.2010 12:57 #
Мне проще один раз немного манов скурить, настроить и потом больше никогда не тыкать мышкой. :)
Правильно там про фломастеры говорят.
cppmm 04.06.2010 11:47 #
1. Скрипт весьма полезен, я бы попросил автора покурить в сторону выбора сети без перезагрузки сети, было бы круто вообще.

Уже начал. Если правильно понял логику работы, это реализуется через udev и опцию aloow-hotplug(а именно, скрипт /lib/udev/net.agent). Когда разберусь, разумеется отпишусь. Просто пока я не совсем разобрался, как udev получает параметры, указанные в interfaces. Но маны решают.
lwilis 04.06.2010 15:29 #
настройте PPPoE через chap-secrets, имея под рукой только маны.
Хинт: pppoe-setup
В общем как два пальца об асфальт.
Username 04.06.2010 16:04 #
я какбэ имел ввиду _без_каких-либо конфигураторов
lwilis 04.06.2010 16:20 #
Зачем же? pppoe-setup есть по дефолту, на моей памяти оно было всегда.
Так можно принять религию, запрещающую использовать ls и городить нечто типа:
for i in * ; do echo $i ; done
dicson 04.06.2010 11:18 #
Хотите консоли - блять, настройте PPPoE через chap-secrets, имея под рукой только маны.

проблем не возникало
dfx 04.06.2010 11:22 #
+1. Настраивал в своё время, управился за час примерно (вместе с чтением манов). Причём сначала пытался через NM (часа два честно старался и потел) - не получилось. Эта сволочь даже не говорит, что не так, просто не соединяется. А через конфиги - каждый шаг можно проверить за 5.2 и поправить сразу.
Username 04.06.2010 11:47 #
Хочешь ли ты сказать, что ты не осилил nm?
dfx 04.06.2010 11:59 #
Осилил. В последних версиях. До этого NM наотрез отказывался подключаться к моей точке доступа. Настройки ТД не менялись, если чё..
dfx 04.06.2010 12:00 #
А к PPPoE я тогда так и не смог подключиться, да. Давай, объясни мне насколько неверен изгиб моих рук для работы с таким удобным и хорошим NM.
Username 04.06.2010 12:32 #
NM наотрез отказывался подключаться к моей точке доступа

к PPPoE я тогда так и не смог подключиться,

Осилил

отказывался

не смог

Осилил
dfx 04.06.2010 12:56 #
Бредогенератор отменный, да... Молодец, аргументировал.
cppmm 04.06.2010 11:51 #
Всегда так делал.
Я даже больше скажу. Описанную в топике настройку настройку я сделал без доступа к гуглу - забыл дома инет оплатить и от нечего делать решил попилить сеть на нетбуке. Вся информация, которая мне понадобилась есть в man interfaces, /usr/share/doc/ifupdown и манах к тем утилитам, что я использовал.
assaron 04.06.2010 11:50 #
мне кажется, что wicd умеет тоже самое и немножко больше, так что советую посмотреть в его сторону
cppmm 04.06.2010 12:00 #
Я там выше писал, что знаю о wicd. Но предпочитаю использовать имеющиеся инструменты, если они работают хорошо, а не доустанавливать много всего и сразу.
assaron 04.06.2010 12:10 #
ну да, а потом, еще напишешь поддержку подключению без перезапуска, еще чего-нибудь, и получится монструозный велосипед
cppmm 04.06.2010 12:23 #
Стоп.
А вот этого не надо. Я не писал ничего нового. Это стандартный путь настройки, предусмотренный дистрибутивом и имеющимися в нём инструментами.
Stanzas beginning with the word "mapping" are used to determine how a logical interface name is chosen for a physical interface that is to be brought up. The first line of a mapping stanza
consists of the word "mapping" followed by a pattern in shell glob syntax. Each mapping stanza must contain a script definition. The named script is run with the physical interface name
as its argument and with the contents of all following "map" lines (without the leading "map") in the stanza provided to it on its standard input. The script must print a string on its
standard output before exiting. See /usr/share/doc/ifupdown/examples for examples of what the script must print. (c) man interfcaes

Если уж сравнивать, то это wicd и nm - велосипеды, потому как оказывается без них всё работает. И если у кого-то нет времени/желания/знаний для того, чтобы разобраться в том, что предоставляет дистрибутив - это их выбор. Мне это не надо. И, как я и написал, судя по манам, подключение без перезапуска сети - это тоже предусмотренная разработчиками опция.
dfx 04.06.2010 12:01 #
Он может. Но это как и NM - лишняя прослойка между пользователем и системой.
other.bigmouse 04.06.2010 11:58 #
Где-то я уже подобное видел.
cppmm 04.06.2010 12:01 #
# pacman -S netcfg
bash: pacman: команда не найдена
Ваш вариант не работает.
dfx 04.06.2010 12:02 #
Там арч, тут дебиан.
other.bigmouse 04.06.2010 12:15 #
А я и не спорю. Просто говорю что видел.
dfx 04.06.2010 12:23 #
Так при чём здесь видел? Арчевский метод ну никак не применить к дебиану %)
Username 04.06.2010 12:34 #
http://packages.debian.org/sid/netcfg
опенсурс, еба
cppmm 04.06.2010 12:37 #
йопрст.
И после этого говорят о том, что везде наплодили зоопарки дистрибутивов, несовместимых друг с другом. В gentoo можно поставить apt-get, в debian арче-конфиги сети, в слаке попадаются rpm'ки созданные для слаки... :))
Username 04.06.2010 14:17 #
Мне в генту больше всего нравится как она лезет в deb-src и с них код тырит :)
cppmm 04.06.2010 15:37 #
Ага. Есть такое.
А ещё у меня есть один знакомый гентушник, который с помощью emerge, пары скриптов и такой-то матери deb-пакеты собирает, потому что на серверах держит дебиан. :)
dfx 04.06.2010 12:56 #
Ну да, давай ещё виндовое что-нибудь под вайн допилим.
other.bigmouse 04.06.2010 12:42 #
linux никак не применить к linux'u
dfx 04.06.2010 12:57 #
прикрути-ка мне движок от мерса к жигулям или наоборот. Обе ведь машины - не проблема будет.
other.bigmouse 04.06.2010 13:11 #
К жигулям вряд-ли а вот к волге вполне.
cppmm 04.06.2010 13:07 #
Я обожаю эти интернеты! Ведь просто один способ настройки сети показал, а тут набежали и устроили локальный холивар. :))
Люди-человеки, не бойтесь. После моего маленького топика никто не выпилит nm из дистрибутивов. Не надо пытаться его так яро защищать. Я не буду приходить к вам домой и поголовно настраивать всё через interfaces. :)
dfx 04.06.2010 13:10 #
Священная война на то и священная, что ведётся не за логику и здравый смысл, а так.. за идею %))
Shtsh 04.06.2010 13:17 #
Настоящему линуксоиду пофиг на инструмент. Но холивар - это святое!
ЛОР, кажется
xtavras 04.06.2010 14:31 #
Уже повторял сколько раз, кто как хочет так и дрочит, способ весьма хорош когда сети особо не меняются, да и дает понять как оно все работает, это главное, cppmm велосипедист в хорошем смысле этого слова)) лично я подчерпнул для себя интересное про маппинг. А вот что лично мне тут не нравится, что если нужно быстро подключится к новой сетке, нужно работать руками (и головой=) на что тратится время, вообщем у меня на дебиане wicd работал когда-то и я не жаловался.