The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

Создание реконнект-скрипта для DSL-модема
Принудительный реконнект может потребоваться для получения нового IP-адреса при
пользовании, к примеру, таких сервисов, как rapidshare.

Для браузера Firefox существует дополнение "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 Karbofos

    echo "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

Пауза в 5 секунд необходима для получения нового IP адреса, величина зависит от
провайдера, устанавливается экспериментальным путём. Если пауза будет меньше,
то есть вероятность того, что вы получите предыдущий IP.

Конечно, если у вас доступ к настройкам возможен через ввод пароля, то и скрипт
нужно расширить, добавив к wget опции "--http-user=логин
--http-password=пароль". Если машина не однопользовательская, параметры
аутентификации можно поместив их в файл ~/.wgetrc, указав http_user=логин и http_password=пароль.

Или же логин можно "отловить" через веб-интерфейс и расширить скрипт,
основываясь на данных (для вышеприведенного примера):

   POSTDATA=controller=Overview&action=Login&id=0&idTextPassword=YourPassword

для приложения http://192.168.1.1/cgi-bin/Hn_login.cgi


Часть 2. Написание реконнект-скрипта для DSL модема с использованием telnet

Собственно, была небольшая проблема реконнекта модема от Zyxel с целью
получения нового IP-адреса. Этот скрипт я использовал еще до того, как нашёл
возможность проделывать сию процедуру через веб-интерфейс.

При входе на модем через telnet, необходимо пройдись по пунктим меню:


   telnet 192.168.1.1
   superadmin,yourpassword
   24
   8
   poe drop poe0
   dev dial 1
   99

Зная эту последовательность команд, пишем скриптик для реконнекта:

   #!/bin/sh
   host=192.168.1.1
   port=23
   login="superadmin"
   passwd="yourpassword"

   (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


Или циклом:

   #!/bin/bash
   host=127.0.0.1
   port=23
   arr=( "superadmin" "yourpassword" "24" "8" "poe drop poe0" "dev dial 1" "99" )

   (echo open ${host} ${port}
    sleep 1
    for j in "${arr[@]}"
    do
      echo $j
      sleep 1
    done
   echo exit) | telnet


Задержки в секунду (sleep 1) вводились сугубо из-за опасения за медленную реакцию модема.
 
27.04.2011 , Автор: Карбофос , Источник: http://eduard-x.blogspot.com/2011/0...
Ключи: modem, shell, wget
Раздел:    Корень / Пользователю / Работа с Web и Ftp

Обсуждение [ Линейный режим | Показать все | RSS ]
  • 1.1, mma (?), 07:05, 28/04/2011 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    обычно на модемах естьт telnet, его проще использовать из скриптов.
    Но описанный подход как минимум оригинален
     
     
  • 2.3, Карбофос (ok), 10:59, 28/04/2011 [^] [^^] [^^^] [ответить]  
  • +/
    да, это так. просто хотел максимально упростить процесс, т.к. через telnet приходится проходить порой пару-тройку промежуточных пунктов интерфейса, что усложняет написание скрипта.
     

  • 1.2, vi_m (ok), 09:29, 28/04/2011 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    Опишите, пожалуйста, что-то подобное через telnet, интересно посмотреть. Зачастую там достаточно скудный набор функций, и я не нашел сходу способа.
    Подход действительно интересный, сколько маны не читай, всегда от коллег услышишь что-то новое)
     
     
  • 2.4, Карбофос (ok), 11:16, 28/04/2011 [^] [^^] [^^^] [ответить]  
  • +/
    там просто нужно работать с пайпами, пробираясь от одного пункта меню к другому. в принципе, это вызывает много вопросов у новичков и является дополнительной причиной ошибок. где-то в сети видел подобный скрипт, могу попытаться найти.
     
     
  • 3.5, Andrey Mitrofanov (?), 11:29, 28/04/2011 [^] [^^] [^^^] [ответить]  
  • +/
    > найти.

    google: dsl telnet script

     
  • 2.7, reader (ok), 20:23, 28/04/2011 [^] [^^] [^^^] [ответить]  
  • +/
    #!/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
     
     
  • 3.8, anonymous (??), 22:40, 28/04/2011 [^] [^^] [^^^] [ответить]  
  • +/
    Спасибо, узнал про существование полезной утилиты. Так понимаю, написана на тикле(тянет по зависимостям при установке)? А реализовать подобное на чистом баше, без сторонних утилит - возможно? Чистое любопытство.
     
     
  • 4.9, anonymous (??), 22:50, 28/04/2011 [^] [^^] [^^^] [ответить]  
  • +/
    > Спасибо, узнал про существование полезной утилиты. Так понимаю, написана на тикле(тянет
    > по зависимостям при установке)? А реализовать подобное на чистом баше, без
    > сторонних утилит - возможно? Чистое любопытство.

    Отвечаю сам себе:
    (
    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. Интересно, работает? Возможности проверить сейчас нет.

     
     
  • 5.10, Карбофос (ok), 23:37, 28/04/2011 [^] [^^] [^^^] [ответить]  
  • +/
    Не всегда, например скрипт для одной из железок 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

     
  • 5.11, Andrey Mitrofanov (?), 00:00, 29/04/2011 [^] [^^] [^^^] [ответить]  
  • +/
    >Интересно, работает? Возможности проверить сейчас нет.

    Иногда - работает. Скорее всего так.

    Исходя из того, что echo+sleep _совсем_ не одно и то же, что send+expect. То есть работает-работает, а потом "вдруг" 2 секунд не хватило (или 10, или сколько там) - и... не узнаешь никогда... вот.

    Ну, хоть не пуск ракет~~~

     
  • 2.13, Vlad (??), 23:51, 15/05/2011 [^] [^^] [^^^] [ответить]  
  • +/

    #!/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;
     
     
  • 3.14, Vlad (??), 23:52, 15/05/2011 [^] [^^] [^^^] [ответить]  
  • +/
    #!/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;

     

  • 1.12, vasilisc (?), 18:21, 02/05/2011 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    У моего D-link ADSL DSL-2500U/BRU/D не было телнет и я рестартил через вебморду скриптом.
    http://vasilisc.com/scripts_linux#restart_modem
     
     
  • 2.15, Карбофос (ok), 22:35, 19/08/2012 [^] [^^] [^^^] [ответить]  
  • +/
    ну первый способ и был написан для веб-морд
     


     Добавить комментарий
    Имя:
    E-Mail:
    Заголовок:
    Текст:




    Партнёры:
    PostgresPro
    Inferno Solutions
    Hosting by Hoster.ru
    Хостинг:

    Закладки на сайте
    Проследить за страницей
    Created 1996-2024 by Maxim Chirkov
    Добавить, Поддержать, Вебмастеру