Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Perl: Системное программирование > telnet


Автор: Bulat 24.12.2013, 07:41
Код

#!/usr/bin/perl

use strict;
use Net::Telnet;

my $host = ******;

my $t = new Net::Telnet (
  Host => $host, 
  Timeout => 25, 
  dump_log => "/var/log/restart_dump.log",
  input_log => "/var/log/restart.log",
  output_log => "/var/log/restart_output.log"
);

$t -> waitfor('/Key in your selection/');
$t -> cmd("s");

$t -> waitfor('/Key in your selection/');
$t -> cmd("y");


скрипт умирает со словами 
command timed-out at restart.pl line 17

restart.log :
Код

-----------------------------------------------------------------------------
Model name       : NPort 5150
MAC address      : 00:90:E8:23:DC:85
Serial No.       : 9435
Firmware version : 3.3 Build 08061714
System uptime    : 0 days, 16h:02m:49s
-----------------------------------------------------------------------------
<< Main menu >>
  (1) Basic settings
  (2) Network settings
  (3) Serial settings
  (4) Operating settings
  (5) Accessible IP settings
  (6) Auto warning settings
  (7) Monitor
  (8) Ping
  (9) Change password
  (a) Load factory default
  (v) View settings
  (s) Save/Restart
  (q) Quit

Key in your selection: s

-----------------------------------------------------------------------------
Ready to restart
  (y) Yes
  (n) No

Key in your selection: 


косяк в промпте или в чем-то другом??

Автор: Сумасшедший 24.12.2013, 08:58
В waitfor вроде как должна регулярка быть красивая. Т.е. наподобии
^Key in your selection(.*)$

Автор: Bulat 24.12.2013, 09:52
Цитата(Сумасшедший @  24.12.2013,  08:58 Найти цитируемый пост)
^Key in your selection(.*)$ 

 smile так тож не хочет.

Но вообще мне удалось нахачить рабочий вариант
Код

#!/usr/bin/perl

use strict;
use Net::Telnet;

my $host = *******;

my $t = new Net::Telnet (
  Host => $host, 
  Timeout => 10,
  Prompt => "/Key in your selection/is",
  dump_log => "/var/log/restart_dump.log",
  input_log => "/var/log/restart.log",
  output_log => "/var/log/restart_output.log"
);

sleep(1);
$t -> cmd("s");

$t -> waitfor('/Key in your selection/is');
$t -> cmd("y");


правда в инпут логах ничего не изменилось, а вот в дампе видны. Моха рестартует.

Автор: tzirechnoy 29.12.2013, 16:43
Да, в промпте. Вы не выставили промпт, собственно (а по умолчанию там вещи под unix shell, и совсем не то, что Вам нужно).

Автор: Bulat 8.1.2014, 09:14
Цитата(tzirechnoy @  29.12.2013,  16:43 Найти цитируемый пост)
а по умолчанию там вещи под unix shell, и совсем не то, что Вам нужно

ну раз вы знаете то, что мне нужно, может и код подскажете, тем более скрипт не более чем в пару десятков строк!  smile 

Автор: tzirechnoy 8.1.2014, 15:37
ну, что-то в стиле 
Код

$t->prompt('/Key in your selection:/');
$t->waitfor($t->prompt());
$t->cmd('s');
$t->cmd('y');


после new Net::Telnet.
Последнее, возможно, лучшэ заменить на $t->print('y'), поскольку после этого приглашэния на ввод ужэ не будет.
Или вообще не париться с промптами, а просто 
Код

$t->print('s');
$t->print('y');


Вообще, ты программист, ты и отлажывай.

Автор: Сумасшедший 8.1.2014, 18:15
Приглашение telnetd:
Код

telnet 127.0.0.1
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.
Ubuntu 12.04.3 LTS
lapa login: 

Код
Код
$t->waitfor('/^lapa login: $/');

Будет ждать бесконечно, т.к. от промпта описана только одна строка
А вот
Код
$t->waitfor("/^Ubuntu 12.04.3 LTS\nlapa login: /");

будет работать, т.к. промпт описан полностью.
В целом и междусисечный логин тоже будет работать.
Код
$t->waitfor('/(.*)lapa login:(.*)/');

Надеюсь, намёк понятен:)

Автор: tzirechnoy 8.1.2014, 19:08
Цитата
Код
$t->waitfor('/^lapa login: $/');

Будет ждать бесконечно, т.к. от промпта описана только одна строка


Этот код будет работать бесконечно, т.к. правильный код -- 
Код
$t->waitfor('/^lapa login: $/m');

За разъяснениями -- man perlre.

Автор: alezzz 8.1.2014, 22:54
с промптом можно и попроще, неважно сколько строк перед логином
Код

#!/usr/local/bin/perl

use Net::Telnet;

my $t = new Net::Telnet;

$t->open('***');
my ($pm, $m) = $t->waitfor('/ogin:\s*/');

print "$pm\n-----\n$m\n";


Код

                        DES-1210-28 Fast Ethernet Switch
                            Command Line Interface

                           Firmware: Build 5.10.B040
             Copyright(C) 2010 D-Link Corporation. All rights reserved.
DES-1210-28 l
-----
ogin:

главное не перестараться, а то сделал как-то '/#|>|:/' и конечно нашлось в дескрипшене свича ':'.

а код в первом посте не заработал скорее всего именно из-за промпта, из Net::Telnet:
Код

cmd - issue command and retrieve output
...
This method sends the command $string, and reads the characters sent back by the command up until and including the matching prompt.

Автор: Bulat 9.1.2014, 07:48
tzirechnoy, ты прав! Вариант с 

Код

$t->prompt('/Key in your selection:/');
$t->waitfor($t->prompt());


работает как часы!

Сумасшедший, спасибо за отклик, но в данном случае проблема все же была с объявлением самого промпта методами модуля, нежели с сотавлением регулярного выражения.

Код

#!/usr/bin/perl

use strict;
use Net::Telnet;

my $host = ********;

my $DumpLog = "./restart_dump.log";
my $InputLog = "./restart_input.log";
my $OutputLog = "./restart_output.log";

my $t = new Net::Telnet (
  Host => $host, 
  Timeout => 10,
  dump_log => $DumpLog,
  input_log => $InputLog,
  output_log => $OutputLog
);

$t->prompt('/Key in your selection:/');
$t->waitfor($t->prompt());

$t->cmd('s');
$t->cmd('y');


мне кажется идеальный вариант, по крайней мере у меня работает без лишних хаков!

Автор: msAvtor 19.6.2014, 20:16
с промптом можно и попроще, неважно сколько строк перед логином

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)