2014-10-23 3 views
-1

Вот фрагмент моего сценария, который будет ждать строки «имя пользователя:» и распечатать имя пользователя для входа в систему, а огромная часть загрузочного сообщения печатается до появления «username:», иногда скрипт отсутствует, чтобы найти его и возвращая слово «Не удалось найти имя пользователя:», особенно когда некоторые пропущенные сообщения о загрузке печатаются после строки «username:», так что есть ли более надежный способ сделать это? Благодарю.Надежная альтернатива waitfor() в Perl

my %words = (
    username => 'user1', 
    username_string => 'username: $', 
); 
($prematch, $match) = $obj->{comm}->waitfor(Match => "/$words{username_string}/",Errmode => "return"); 
if (!defined $match) { 
    print "Failed to find username:"; 
    return; 
} 
else { 
    $obj->{comm}->print($words{username}); 
} 

$ OBJ является объектом Net :: Telnet

+8

waitfor(), очевидно, метод для некоторого класса. Помочь вам было бы легче, если бы мы знали, какой класс был ... – tjd

+1

Похоже, он исходит из ['Net :: Telnet'] (https://metacpan.org/pod/Net::Telnet) – Zaid

+0

да, извините, он исходит из NET :: Telnet, я все еще понимаю скрипт, который я обновляю. – rodee

ответ

0

на самом деле я не знаю, какой тип объекта связан с вашим $ OBJ. предполагая, что это может быть Net :: Telnet может быть, это может помочь вам:

perl-telnet-does-not-wait-for-the-end-of-the-previous-command

Futhermore:

($prematch, $match) = $obj->{comm}->waitfor(Match => "/$words{username_string}/",Errmode => "return"); 

может быть, это лучший подход, чтобы захватить выход CMD в переменную массива

my @lines = $telnet->cmd($comm); 
for (my $line: @lines) { 
    # your matching goes here.. 
} 

или попробовать это:

$t = new Net::Telnet(Host =>"192.168.0.1", Timeout => 5,Port => "1701", Prompt => '/>\$ $/'); 
$t->print($comm); 
$t->waitfor('/username: $/i'); 
print "result=", $s; 
Смежные вопросы