使用Net :: Appliance :: Session编写cisco横幅

时间:2015-02-06 14:28:28

标签: regex perl network-programming cisco

有没有人遇到过这个问题?当脚本到达横幅文本时,脚本就会挂起。

我正在使用Net::Appliance::Session

这是我在调试中遇到的错误。脚本的其余部分完美地插入代码。我测试了我读到的关于在每行的横幅上添加#的内容。结果相同。

banner login +
[   4.092880] tr   nope, doesn't (yet) match (?-xism:[\/a-zA-Z0-9._\[\]-]+ ?(?:\(config[^)]*\))? ?[#>] ?$)
[   4.093124] du   SEEN:
banner login +
[   4.093304] tr   nope, doesn't (yet) match (?-xism:[\/a-zA-Z0-9._\[\]-]+ ?(?:\(config[^)]*\))? ?[#>] ?$)
[   4.305872] du   SEEN:
Enter TEXT message.  End with the character '+'
[   4.306121] tr   nope, doesn't (yet) match (?-xism:[\/a-zA-Z0-9._\[\]-]+ ?(?:\(config[^)]*\))? ?[#>] ?$)
We had an issue when accessing the device : 10.49.216.74
The reported error was : read timed-out at /usr/lib/perl5/site_perl/5.10.0/Net/CLI/Interact/Transport/Wrapper/Net_Telnet.pm line 35

这是一段代码。

            my $session_obj = Net::Appliance::Session->new(
                host => $ios_device_ip,
                transport => 'Telnet',
                personality => 'ios',
                timeout => 60,
        );

#interace
        $session_obj->set_global_log_at('debug');
        eval {
                 # try to login to the ios device, ignoring host check
                $session_obj->connect(
                username => $ios_username,
                password => $ios_password,
                #SHKC => 0
        );
        # get our running config
        $version_info = $session_obj->begin_privileged;
        $session_obj->cmd('conf t');
        $session_obj->cmd('line con 0');
        $session_obj->cmd('exec-character-bits 8');
        $session_obj->cmd('international');
        $session_obj->cmd('line vty 0 4');
        $session_obj->cmd('exec-character-bits 8');
        $session_obj->cmd('international');
        $session_obj->cmd('line vty 5 15');
        $session_obj->cmd('exec-character-bits 8');
        $session_obj->cmd('international');
        $session_obj->cmd('exit');
        $session_obj->cmd('no banner login');
        $session_obj->cmd('banner login +');
        $session_obj->cmd('*************************************************************************');
        $session_obj->cmd('*                          test                                         *');
        $session_obj->cmd('*                                                                       *');
        $session_obj->cmd('*************************************************************************');
        $session_obj->cmd('+');
        $session_obj->cmd('no banner MOTD');
        $session_obj->cmd('banner motd +');
        $session_obj->cmd('*************************************************************************');
        $session_obj->cmd('*                          test                                         *');
        $session_obj->cmd('*                                                                       *');
        $session_obj->cmd('*************************************************************************');
        $session_obj->cmd('+');
        $session_obj->cmd('exit');
        $session_obj->cmd('write memory');
        $session_obj->end_privileged;
        # close down our session
        $session_obj->close;
};

2 个答案:

答案 0 :(得分:0)

如果在发送新命令之前查看与提示符匹配的正则表达式,您将看到它需要一个与路由器的用户,特权或配置模式紧密匹配的特定字符串。

当您发送banner login +命令时,您会从路由器(而不是您的脚本所期望的Enter TEXT message. End with the character '+')获得Router(config)#后跟空白行。过了一会儿它就会超时与正则表达式不匹配。

最简单的解决方案是尝试在一个命令中发送整个横幅。尝试将横幅与\r连接在一个字符串中,并将其作为一个看起来像的命令发送(注意双引号):

$session_obj->cmd("banner login + line1 \r line2 \r line3\r +");

答案 1 :(得分:0)

花了太长时间来解决这个问题......空间不是你的朋友。

$session_obj->cmd("banner login + \rline1\rline2\rline3\r+");

我的原始问题示例:

$session_obj->cmd('*************************************************************************\r*                          test                                         *\r*                                                                  *\r*************************************************************************');