【问题标题】:execute command telnet via perl script通过 perl 脚本执行命令 telnet
【发布时间】:2015-10-30 20:43:11
【问题描述】:

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

这是通过telnet正常登录时的结果图像:

#!/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');

【问题讨论】:

    标签: perl telnet


    【解决方案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");
    

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

    【讨论】:

    • 似乎模式匹配,但它在 telnet.pl 第 25 行显示命令超时(请参阅该 promt 正则表达式),结果是: ---------- -------------------------------------------------- ------------ > 就像是在输入命令的第一个字符并暂停
    • @sam 听起来不匹配。你试过我的吗?我不熟悉 Net::Telnet 的工作原理,也没有方便尝试的路由器。
    • 它似乎是匹配的看这里postimg.org/image/63j44gu5t 这是 cmd "adsl show" 的第一个字符 这是注销的打印屏幕 put received_data.txt
    • 我相信你需要使用prompt方法。见第一个例子。 metacpan.org/pod/Net::Telnet#EXAMPLES
    猜你喜欢
    • 1970-01-01
    • 2014-11-02
    • 2015-11-20
    • 2012-01-14
    • 2012-10-20
    • 1970-01-01
    • 2015-11-01
    • 1970-01-01
    • 2017-02-26
    相关资源
    最近更新 更多