使用 Net::Appliance::Session 编写思科横幅脚本

Scripting the cisco banner with Net::Appliance::Session

有人 运行 了解这个问题吗?当脚本到达横幅文本时,脚本就会挂起。

我正在使用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;
};

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

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

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

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

花了太长时间才弄清楚...空间不是你的朋友。

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

我的原始问题示例:

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