2015-08-07 4 views
1

Я пытаюсь выполнить команду через скрипт Perl с помощью telnet, кажется, что приведенный ниже сценарий способен успешно войти в систему, но не может выполнить команду. Я не могу найти правильное регулярное выражение, которое будет ждать подсказки > перед выполнением команды.выполнить команду telnet через perl-скрипт

Вот изображение результата при входе нормально телнетом:

screenshot

#!/usr/bin/perl 
use strict; 
use warnings; 
use Net::Telnet; 
my $remote_host = 'myrouter'; 
my $telnet = new Net::Telnet (Timeout=>10 ,Input_log => "received_data.txt"); 
$telnet->open($remote_host); 
$telnet->waitfor('/ADSL2PlusRouter login:/i'); 
$telnet->print('mylogin'); 
$telnet->waitfor('/Password:/i'); 
$telnet->print('my_password'); 
$telnet->waitfor('/-*>/'); 
$telnet->cmd("adsl show"); 
$telnet->print('exit'); 

ответ

1

Вы должны принять во внимание, что, вероятно, символ разрыва строки. Я не уверен, как строка, которую Net :: Telnet соответствует шаблону, выглядит точно, но, вероятно, достаточно добавить некоторые пробелы в шаблон.

$telnet->waitfor('/-\s*>/'); 

Таким образом, вы будете иметь последнюю черту конца линии на картинке, а затем, возможно, некоторые пробелы, которые были бы \n, а затем >.

Также проверьте https://regex101.com/r/eQ2pR0/1.


Update: Двигаясь дальше в Net::Telnet documentation я думаю, что первый пример очень полезно здесь. docs say this about prompt.

Этот метод устанавливает шаблон, используемый для поиска приглашения во входном потоке. Он должен быть строкой, представляющей действительный оператор соответствия шаблону perl. Методы login() и cmd() пытаются прочитать до соответствия подсказке. Они будут терпеть неудачу с ошибкой тайм-аута, если выбранный вами шаблон не совпадает с отправкой удаленной стороны.

Поэтому я думаю, что вам не нужно использовать waitfor, но вместо этого используйте prompt.

$telnet->print('my_password'); 
$telnet->prompt('/^> /'); 
$telnet->cmd("adsl show"); 

Поскольку маршрутизатор не имеет никакой информации в своей строке, просто установив его на «начало строки, > и пространство должно работать.

+0

Кажется, что шаблон соответствует, но он говорит, что команда тайм-аута в строке telnet.pl 25 (см. Это регулярное выражение promt), и результат: --------------- -------------------------------------------------- ------- > a это похоже на то, что он набирает первый символ команды, и он приостанавливает –

+0

@sam похоже, что это не соответствует. Вы пробовали мои? Я не знаком с тем, как работает Net :: Telnet, и у меня нет маршрутизатора, который можно попробовать. – simbabque

+0

Кажется, это совпадение взгляните здесь http://postimg.org/image/63j44gu5t/ это первый символ cmd «adsl show», это экран печати логарифма put received_data.txt –

Смежные вопросы