Принудительный реконнект может потребоваться для получения нового IP-адреса при пользовании, к примеру, таких сервисов, как rapidshare.Для браузера Firefox существует дополнение "[[https://addons.mozilla.org/en-US/firefox/addon/tamper-data/ Tamper Data]]", с помощью которого можно отлавливать и разбирать по полочкам запросы GET/POST. Так вот, основа того, что можно реконнектить модем через веб-интерфейс настроек модема, как раз и лежит в этом способе. Всего (обычно) действий четыре: логин с паролем, разрыв соединения и через некоторое время (5-10 секунд) - восстановление соединения с внешним миром и выход из настроек.
Рассмотрим два шага, для случая, если в локальной сети к установкам модема можно "дотянуться" без пароля.
Если мы уже находимся в веб-интерфейсе настроек модема, то нужно найти кнопки "Disconnect" и "Connect". После этого включаем "Tamper Data" через панель расширений и созерцаем соединения GET/POST в нашем окне. Жмём "Disconnect" в веб-интерфейсе модема и смотрим, что происходит в нижнем левом окне:
POSTDATA=controller=Internet&action=DisconnectInternet&id=0&ReturnPage=%2Fdiagnostic.htm
В верхнем окне, в строке "POST" видим
http://192.168.1.1/cgi-bin/Hn_wan.cgi
Таким же образом определяем восстановление соединения с внешним миром:
POSTDATA=controller=Internet&action=ConnectInternet&id=0&ReturnPage=%2Fdiagnostic.htm
для
http://192.168.1.1/cgi-bin/Hn_wan.cgi
Затем пишем простой shell-скрипт:
#!/bin/sh
# by Karbofosecho "disconnect"
wget -q -O /dev/null --post-data="controller=Internet&action=DisconnectInternet&id=0&ReturnPage=%2Fdiagnostic.htm" http://192.168.1.1/cgi-bin/Hn_wan.cgi >/dev/null 2>&1
sleep 5
echo "connect"
wget -q -O /dev/null --post-data="controller=Internet&action=ConnectInternet&id=0&ReturnPage=%2Fdiagnostic.htm" http://192.168.1.1/cgi-bin/Hn_wan.cgi >/dev/null 2>&1Как видно, текст из буфера обмена нужно немного переработать, выкинув текст "POSTDATA=" и обращаться нужно не просто по IP адресу модема, а вызывать нужное cgi приложение, в нашем случае Hn_wan.cgi
Конечно, если у вас доступ к настройкам возможен через ввод пароля, то и скрипт нужно расширить, добавив к wget опции "--http-user=логин --http-password=пароль". Если машина не однопользовательская, параметры аутентификации можно поместив их в файл ~/.wgetrc, указав http_user=логин и http_password=пароль.
URL:
Обсуждается: http://www.opennet.me/tips/info/2569.shtml
обычно на модемах естьт telnet, его проще использовать из скриптов.
Но описанный подход как минимум оригинален
да, это так. просто хотел максимально упростить процесс, т.к. через telnet приходится проходить порой пару-тройку промежуточных пунктов интерфейса, что усложняет написание скрипта.
Опишите, пожалуйста, что-то подобное через telnet, интересно посмотреть. Зачастую там достаточно скудный набор функций, и я не нашел сходу способа.
Подход действительно интересный, сколько маны не читай, всегда от коллег услышишь что-то новое)
там просто нужно работать с пайпами, пробираясь от одного пункта меню к другому. в принципе, это вызывает много вопросов у новичков и является дополнительной причиной ошибок. где-то в сети видел подобный скрипт, могу попытаться найти.
> найти.google: dsl telnet script
#!/usr/bin/expect -f
######################################################################################
#$remote_server - сервер, к которому осуществляется доступ #
#$my_user_id - имя пользователя на сервере #
#$my_password - пароль пользователя на сервере #
#$my_command - команда, которая будет запущена на сервере #
# #
######################################################################################
set remote_server1 192.168.1.1
set my_user_id root
set my_password password
set my_command1 "ifconfig"
set my_command2 "PPP=`cat /var/run/ppp0.pid` && kill HUP \$PPP"
set my_command3 ""
#
# Открываем telnet сессию на удаленном сервере, и ждем запроса имени пользователя.
spawn telnet $remote_server1
expect "login:"
# Посылаем имя пользователя и ждем запроса пароля.
send "$my_user_id\r"
expect "Password:"
# Посылаем пароль и ждем приглашения ввода командного интерпретатора.
send "$my_password\r"
expect "%"
# Посылаем команду, и ждем следующего приглашения ввода командного интерпретатора.
# send "$my_command1\r"
# expect "%"
send "$my_command2\r"
expect "%"
# send "$my_command3\r"
# expect "%"
# Завершаем сессию telnet, и ждем символа конца строки (eof).
send "exit\r"
expect eof
Спасибо, узнал про существование полезной утилиты. Так понимаю, написана на тикле(тянет по зависимостям при установке)? А реализовать подобное на чистом баше, без сторонних утилит - возможно? Чистое любопытство.
> Спасибо, узнал про существование полезной утилиты. Так понимаю, написана на тикле(тянет
> по зависимостям при установке)? А реализовать подобное на чистом баше, без
> сторонних утилит - возможно? Чистое любопытство.Отвечаю сам себе:
(
echo open 192.168.1.1
sleep 2
echo "admin"
sleep 1
echo "admin"
sleep 1
echo "ppp config 0.8.35 1 down"
sleep 8
echo "ppp config 0.8.35 1 up"
sleep 8
echo "logout"
sleep 1
) | telnetНашел в интернете как раз по dsl script telnet. Интересно, работает? Возможности проверить сейчас нет.
Не всегда, например скрипт для одной из железок Zyxel, в стародавние времена была такая у меня :)#!/bin/sh
host=192.168.1.1
port=23
login="admin"
passwd="examplepassword"(echo open ${host} ${port}
sleep 1
echo ${login}
sleep 1
echo ${passwd}
sleep 1
echo "24"
sleep 1
echo "8"
sleep 1
echo "poe drop poe0"
sleep 1
echo "dev dial 1"
sleep 1
echo exit) | telnet
>Интересно, работает? Возможности проверить сейчас нет.Иногда - работает. Скорее всего так.
Исходя из того, что echo+sleep _совсем_ не одно и то же, что send+expect. То есть работает-работает, а потом "вдруг" 2 секунд не хватило (или 10, или сколько там) - и... не узнаешь никогда... вот.
Ну, хоть не пуск ракет~~~
#!/usr/bin/perl
use Net::Telnet;
my @array = ();
$telnet = new Net::Telnet ( Timeout=>50,
Errmode=>'die',
Prompt => '/[\$%#E<gt>] $/');
$telnet->open('???_IP');
$telnet->login('admin', '???_??????');
@array = $telnet->cmd(String =>'ping -c 10 4.2.2.4');
my $nonet = index($array[$#array-1], "100% packet loss", 1);
if ( ( $#array != 14 ) || ( $nonet > 0 ) )
{
print "rebooting modem \n";
$telnet->cmd('reboot');
$telnet->close;
}
$telnet->close;
#!/usr/bin/perl
use Net::Telnet;
my @array = ();
$telnet = new Net::Telnet ( Timeout=>50,
Errmode=>'die',
Prompt => '/[\$%#E<gt>] $/');
$telnet->open('MODEM_IP');
$telnet->login('admin', 'MY_PASSWORD');
@array = $telnet->cmd(String =>'ping -c 10 4.2.2.4');
my $nonet = index($array[$#array-1], "100% packet loss", 1);
if ( ( $#array != 14 ) || ( $nonet > 0 ) )
{
print "rebooting modem \n";
$telnet->cmd('reboot');
$telnet->close;
}
$telnet->close;
У моего D-link ADSL DSL-2500U/BRU/D не было телнет и я рестартил через вебморду скриптом.
http://vasilisc.com/scripts_linux#restart_modem
ну первый способ и был написан для веб-морд