Информация
Услуги
  • Внедрение
  • Настройка
  • Поддержка
  • Ремонт
Контакты
Новинка
Распродажа
Новости
Доставка
Оплата
Загрузки
  • Прошивки
    • WinBox
    • RouterOS
    • Мобильные приложения MikroTik
    • Архив
  • RouterOS
  • Мобильные приложения MikroTik
  • Архив
Форум
Настройка
    info@mikrotik.moscow
    +7 495 320-55-52
    Заказать звонок
    Mikrotik.moscow
    Каталог
    • Акции
      Акции
    • Маршрутизаторы
      Маршрутизаторы
    • Коммутаторы
      Коммутаторы
    • Радиомосты и уличные точки доступа
      Радиомосты и уличные точки доступа
    • Wi-Fi для дома и офиса
      Wi-Fi для дома и офиса
    • LTE/5G
      LTE/5G
    • Powerline адаптеры
      Powerline адаптеры
    • IoT устройства
      IoT устройства
    • Оборудование 60 ГГц
      Оборудование 60 ГГц
    • Материнские платы RouterBOARD
      Материнские платы RouterBOARD
    • Корпуса
      Корпуса
    • Интерфейсы
      Интерфейсы
    • SFP/QSFP трансиверы
      SFP/QSFP трансиверы
    • Аксессуары
      Аксессуары
    • Антенны
      Антенны
    • Архив
      Архив
    Войти
    0 Сравнение
    0 Избранное
    0 Корзина
    Скачать WinBox Скачать Прошивки Форум > RouterOS Форум > SwOS Форум > Железо
    Mikrotik.moscow
    Каталог
    Войти
    0 Сравнение
    0 Избранное
    0 Корзина
    Mikrotik.moscow
    Телефоны
    +7 495 320-55-52
    Заказать звонок
    0
    0
    0
    Mikrotik.moscow
    • +7 495 320-55-52
      • Назад
      • Телефоны
      • +7 495 320-55-52
      • Заказать звонок
    • info@mikrotik.moscow
    • г. Москва, ул. Бакунинская, 84
    • Пн-Пт: 09-00 до 18-00
      Сб-Вс: выходной


    • Кабинет
    • 0 Сравнение
    • 0 Избранное
    • 0 Корзина
    Главная
    Форум
    Форум
    RouterOS
    Проблемы с использованием Perl Net::SSH:Perl lib и Mikrotik

    Проблемы с использованием Perl Net::SSH:Perl lib и Mikrotik

    Форумы: RouterOS, Аппаратное обеспечение, SwOS, Обратная связь, Объявления, Сторонние инструменты
    Поиск  Пользователи  Правила  Войти
    Страницы: 1
    RSS
    Проблемы с использованием Perl Net::SSH:Perl lib и Mikrotik, RouterOS
     
    _ASM
    Guest
    #1
    0
    08.11.2004 19:14:00
    Я написал этот скрипт: use Net::SSH::Perl;
    $ssh = Net::SSH::Perl->new("host", port => 22, protocol => 1, use_pty => 0);

    $ssh->login('admin', 'pass') or die("Cannot connect to host");

    ($out, $err, $exit) = $ssh->cmd('/ppp active print count-only');

    print $out; Но когда запускаю его, получаю в выводе "/ppp?", а $error установлен в 127. Тот же самый скрипт, только меняю хост на удалённую Linux-машину и команду для выполнения, и всё работает нормально. Какие идеи?
    P.S.: Заметил, что скрипт не подключается к роутеру. Если изменить скрипт на следующий код, он устанавливает удалённую сессию:
    use Net::SSH::Perl;
    $ssh = Net::SSH::Perl->new("host", port => 22, protocol => 1, use_pty => 0);

    $ssh->login('admin', 'pass') or die("Cannot connect to host");
    use Term::ReadKey;
    ReadMode('ultra-raw');
    $ssh->shell;
    ReadMode('restore');
     
     
     
    Eugene
    Guest
    #2
    0
    09.11.2004 09:58:00
    Я бы выбрал Expect.
     
     
     
    _ASM
    Guest
    #3
    0
    09.11.2004 11:08:00
    Видел я, но есть небольшие проблемы с запуском. Еще хочу написать несколько скриптов для работы со строками и прочие штуки. Не понимаю, в чем дело, и хочу понять, почему работает на Linux, а не на Mikrotik.
     
     
     
    Eugene
    Guest
    #4
    0
    09.11.2004 15:24:00
    Кажется, MikroTik не поддерживает выполнение команд через интерфейс $ssh user@host command. Expect позволяет разбирать строки с помощью регулярных выражений. Если этого недостаточно, можно вызвать Expect из Perl-скриптов. Я не особо разбираюсь в Expect, просто не вижу другого надежного способа.
     
     
     
    _ASM
    Guest
    #5
    0
    09.11.2004 17:04:00
    У меня была такая же проблема ещё пару месяцев назад, но я разобрался. Вот только не помню, как именно это сделал. Большой раз между Net::SSH и Net::SSH::Perl. Net::SSH использует команду ssh. Net::SSH::Perl — это SSH-клиент, полностью написанный на Perl. Когда я вспомню, как это сделал, обязательно здесь напишу.
     
     
     
    _ASM
    Guest
    #6
    0
    09.11.2004 17:10:00
    Кажется, один и тот же скрипт работает и с RouterOS версии 2.7.18. Какие есть идеи? (Похоже на какую-то ошибку в RouterOS).
     
     
     
    _ASM
    Guest
    #7
    0
    09.11.2004 17:38:00
    Я немного вас обманул. Скрипт, который работает с 2.7.18, имеет use_pty => 1. Если я установлю его в ноль, я получу тот же результат, что и с 2.8.18. Но 2.8.18 не работает даже с use_pty => 1.
     
     
     
    _ASM
    Guest
    #8
    0
    09.11.2004 20:44:00
    Я сделал walkaround. Просто добавь этот код в Net/Perl/SSH1.pm где-то после строки 339: sub shell_cmd {
       my $ssh = shift;

       my($prompt, $cmd) = @_;

       require Net::SSH::Perl::Handle::SSH1;

       unless ($cmd) {
           $ssh->{config}->set('use_pty', 1)
               unless defined $ssh->{config}->get('use_pty');
       }
       $ssh->_setup_connection;

       $ssh->debug("Requesting shell.");
       my $packet = $ssh->packet_start(SSH_CMSG_EXEC_SHELL);
       $packet->send;

       my ($packet,$pr);
       do {
           $packet = Net::SSH::Perl::Packet->read($ssh);
           $pr = $packet->get_str;
       } while ( ($pr =~ /$prompt/ ) == 0 );

       $ssh->debug("Sending command.");
       my $packet = $ssh->packet_start(SSH_CMSG_STDIN_DATA);
       $packet->put_str($cmd);
       $packet->send;

       $ssh->debug("Command sended");

       my $out = "";

       do {
           $packet = Net::SSH::Perl::Packet->read($ssh);
           $out .= $packet->get_str;
       } while ( ($out =~ /$prompt/ ) == 0 );
       $ssh->_disconnect;
       ($out);
    }
    Скрипт выглядит так: #!/usr/bin/perl
    use Net::SSH::Perl;
    $ssh = Net::SSH::Perl->new("host_here", port => 22, protocol => 1, use_pty => 1, debug => 0 );

    $ssh->login('admin', 'password_here');

    ($out) = $ssh->shell_cmd("] >","/ppp active print count-only\r");

    ($out =~ /(\d+)/) && (($out) = ($1));

    print $out;
    Я создал функцию shell_cmd. Она принимает 2 параметра. Первый — это ожидаемый промпт, а второй — команда для выполнения. Известные ошибки: команда, выполненная, находится в первой строке вывода. Последняя строка — это промпт. Так как я забыл язык PERL, любая помощь в исправлении ошибок приветствуется.
     
     
     
    _ASM
    Guest
    #9
    0
    09.11.2004 23:58:00
    Аргхххххххх! Досадная ошибка в Mikrotik… Я это видел давным-давно… Когда подключаешься к консоли на каком-то хосте, происходит вот что: после первой отправленной \r начинает работать нормально. До этого можно набрать команду, но удалить её и использовать клавишу "tab" не получается, потому что выдаёт 94A и после этого ничего не происходит… Если нажать Enter, команда не выполняется, но всё снова начинает работать нормально… Аргхххххххх!
     
     
     
    Eugene
    Guest
    #10
    0
    10.11.2004 15:43:00
    В конце shell_cmd сопоставляем $out с регулярным выражением, примерно так: $out =~ / [1] \n([\S\s] )\n[\s\w/>]$/; $out = $1; \s\w/ ↩︎
     
     
     
    daniel
    Guest
    #11
    0
    21.11.2004 13:18:00
    Expect — отличный инструмент («язык»), который очень облегчает жизнь при любом интерактивном стиле взаимодействия. Но, конечно, всем хочется использовать другие инструменты, например, обычный ssh или различные языки программирования. Важный момент, на который стоит обратить внимание — это обработка stderr локальным/удаленным компьютером. Это редко делается правильно, потому что «на глаз», когда сессия интерактивная, всё кажется «выводом» со стороны удаленного компьютера. Daniel
     
     
     
    Страницы: 1
    Читают тему
    +7 495 320-55-52
    info@mikrotik.moscow
    Электрозаводская, Бауманская
    Москва, ул. Бакунинская, 84с21
    Конфиденциальность Оферта
    © 2026 «Mikrotik.Moscow»
    Главная Каталог 0 Корзина 0 Избранные Кабинет 0 Сравнение Акции Контакты Услуги Бренды Отзывы Компания Лицензии Документы Реквизиты Поиск Блог Обзоры