Как написать скрипт, проверяющий состояние интернет соединения роутера
Уважаемые пользователи форума.
В этой теме http://www.linux.org.ru/forum/development/3969677#comment-3969684 было обсуждение процесса востановления ppp-соединения роутером.
Поскольку там не присутствовало работающено решения проблемы, я выкладываю статью, в которой я описал решение подобной проблемы на своем роутере.
Как написать скрипт, проверяющий состояние интернет соединения роутера на примере модема
D’link DSL 2640U с провайдером укртелеком ОГО.
Задача.
Есть модем D’link DSL 2640U и dsl соединение с провайдером укртелеком ОГО.
Соединение иногда отваливается.
Модем D’link DSL 2640U обычно сам восстанавливает ADSL-соединение и запускает pppd но,
иногда соединения с сервером повайдера по протоколу РРР не происходит. Необходимо написать скрипт проверяющий состояние соединения и, при обрыве восстанавливающий его.
Операционная система Debian Lenny.
Компьютер соединен с роутером по wifi.
Решение.
Модем D’link DSL 2640U поддерживает управление собой по протоколу ssh.
Это и будем использовать. Нам необходимо написать скрипт автоматический проверяющий
состояние соединения и при отсутствии его, заходит по ssh на модем и перезапускает РРР сессию.
Для этого необходимо использовать инструмент expect. Установим его. Для этого в консоли введем
sudo apt-get install expect
или
sudo aptitude install expect.
Expect — инструмент для автоматизации и тестирования в ОС Unix, написанный
Don Libes как расширение к скрипт-языку Tcl, для интерактивных приложений таких,
как telnet, ftp, passwd, fsck, rlogin, tip, ssh, и других.
С помощью Tk интерактивные приложения могут быть использованы с графическим интерфейсом (GUI) X11.
Expect поддерживает механизм регулярных выражений и основные
возможности программирования, позволяющие простым скриптам эффективно
управлять такими программами как telnet, ftp, и ssh, не обладающими встроенным
скрипт-языком, макросами, или другими механизмами программирования.
Нам нужно выполнять некоторые команды требующие прав супер юзера.
Для того чтобы sudo не спрашивал нас пароль при выполнении этих команд
необходимо править файл настройки /etc/sudoers. В этом файле нужно дописать строку
User mycomp = NOPASSWD: /bin/ping iwconfig
Где User – имя пользователя в системе, mycomp имя хоста.
Подробнее о настройках sudo можно почитать здесь http://system-administrators.info/?p=2574.
Далее нам нужно создать 2 файла. Для этого выполним в консоли
touch /home/user/check_network и touch /home/user/expect_ssh
и далим этим файлам права на выполнение
chmod u +x /home/user/check_network и chmod u +x /home/user/expect_ssh.
Далее в любом текстовом редакторе (vi, nano) открываем эти файлы и, собственно пишем скрипт.
Содержимое файла /home/user/check_network.
#!/bin/bash
HOST=ip_addres_router
#ай-пи адрес вашего роутера
Wifi_up='sudo iwconfig wlan0 essid dark'
INET=google.com
EXPECT='/home/user/expect_ssh '
#Проверяем пингуется ли роутер, и если пинга нет, восстанавливаем wifi-соединение.
if [ «`ping $HOST -c 2 -a | grep ttl`» == «» ]; then
echo «no ping :(»
$Wifi_up
Fi
#Проверяем пингуется ли гугл (он то никогда не упадет :-)) и если нет то выполняем файл expect_ssh
if [ «`ping $INET -c 2 -a | grep ttl`» == «» ]; then
echo «No ping inet»
$EXPECT
fi
echo «connect is good»
Содержимое файла /home/user/expect_ssh
#!/usr/bin/expect
spawn ssh admin@ай-пи_адрес_роутера
expect «password:»
send «Свой пароль на роутер\r»
expect -re «\\> $»
send «ppp config 0.1.32 down\r»
expect «%»
send «ppp config 0.1.32 up\r»
expect «%»
send «logout\r»
expect «closet»
exit 0
Почему мы создали 2 файла? Все довольно просто. Для нормального выполнения bash-скрипта необходимо
объявить #!/bin/bash.А для нормального выполнения expect необходимо объявить #!/usr/bin/expect.
Итак. Скрипт пингует проутер и при отсутствии wifi-соединения восстанавливает его.
Потом скрипт пингует гугл и при отсутствии пинга заходит на роутер по ssh и восстанавливает PPP-соединение.
Если связь есть, скрипт прекращает свою работу.
Для того чтобы скрипт выполнялся каждые 5 минут в файл /etc/crontab дописываем
*/5 **** user /home/user/check_network
и перезапускаем демон crond
sudo /etc/init.d/crond restart.
В итоге мы получаем автоматически контролируемое соединение с провайдером.
Хотел бы добавить полезную ссылку по инструменту expect
http://www.ibm.com/developerworks/ru/library/l-expect_3/index.html