通过perl脚本执行命令telnet

时间:2015-08-07 11:55:04

标签: perl telnet

我正在尝试使用telnet通过Perl脚本执行命令,看起来下面的脚本能够成功登录,但无法执行命令。在执行命令之前,我找不到正确的正则表达式,它将等待提示符>

以下是通过telnet登录normaly时的结果图像:

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 个答案:

答案 0 :(得分:1)

您需要考虑到可能存在换行符。我不确定Net :: Telnet与模式匹配的字符串是如何完全匹配的,但它可能足以在模式中添加一些空格。

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

这样你就会得到图片末尾的最后一个短划线,然后是一些空格,即\n,然后是>

另请查看https://regex101.com/r/eQ2pR0/1

更新:进一步了解Net::Telnet documentation我认为第一个例子在这里非常有用。 docs say this about prompt

  

此方法设置用于在输入流中查找提示的模式。它必须是表示有效perl模式匹配运算符的字符串。 login()和cmd()方法尝试读取,直到匹配提示符。如果您选择的模式与远程端发送的模式不匹配,它们将因超时错误而失败。

所以我认为您不需要使用waitfor,而是使用prompt

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

由于路由器的提示中没有任何信息,只需将其设置为“字符串的开头,>和空格即可。