Perl Telnet/SSH未响应的设备,显示错误

Perl Telnet/SSH未响应的设备,显示错误,perl,network-programming,Perl,Network Programming,我遇到了一个奇怪的问题。我有一些设备存在Telnet/SSH问题。当我运行脚本时,结果显示脚本成功。当调试打开时,我会得到以下结果 [ 0.012464] pr finding prompt [ 0.016593] tr creating Net::Telnet wrapper for telnet [ 0.017859] tr connecting with: telnet Host 10.xx.xx.xx Port 23 如果promot不存在或连接超时,我如何添加一些东西来显

我遇到了一个奇怪的问题。我有一些设备存在Telnet/SSH问题。当我运行脚本时,结果显示脚本成功。当调试打开时,我会得到以下结果

  [ 0.012464] pr finding prompt
  [ 0.016593] tr creating Net::Telnet wrapper for telnet
  [ 0.017859] tr connecting with: telnet Host 10.xx.xx.xx Port 23
如果promot不存在或连接超时,我如何添加一些东西来显示错误

谢谢

   #!/usr/bin/perl

    use Net::Appliance::Session;

    $file = '1list';
    open (FH, "< $file") or die "Can't open $file for read: $!";
    my @ios_list = <FH>;
    close FH or die "Cannot close $file: $!";

    chomp(@ios_list);

    my $ios_username = 'xxxx';
    my $ios_password = 'xxxx';

    DEVICE:
    for my $ios_device_ip ( @ios_list ) {

            my @version_info;

            my $proto = shift;
            if (($proto == 43)||($proto == 44)){
                    $tran = "SSH";
                    $app="/usr/local/bin/ssh";
            }else{
                    $tran = "Telnet";
                    $app="/bin/telnet";
            }

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

    #interace

            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
            $session_obj->begin_privileged;
            $session_obj->cmd('conf t');
            $session_obj->cmd('aaa authorization config-commands');
            $session_obj->cmd('exit');
            $session_obj->end_privileged;
            $session_obj->cmd('write memory');
            # close down our session
            $session_obj->close;
            };

    #error check
            if ($@) {

         if ( UNIVERSAL::isa($@, 'Net::Appliance::Session::Exception') ) {

             # fault description from Net::Appliance::Session
             print "We had an error during our Telnet/SSH session to device  : $ios_devi
    ce_ip \n";
             print $@->message . " \n";

             # message from Net::Telnet
             print "Net::Telnet message : " . $@->errmsg . "\n";

             # last line of output from your appliance
             print "Last line of output from device : " . $@->lastline . "\n\n";

         }
         elsif (UNIVERSAL::isa($@, 'Net::Appliance::Session::Error') ) {

             # fault description from Net::Appliance::Session
             print "We had an issue during program execution to device : $ios_device_ip
    \n";
    #         print $@->message . " \n";

         }
         else {

             # we had some other error that wasn't a deliberately created exception
             print "We had an issue when accessing the device : $ios_device_ip \n";
             print "$ios_device_ip The reported error was : $@ \n";
         }

         next DEVICE;
     }

    print @version_info;
    print "$ios_device_ip ok \n";
    #end
    }
#/usr/bin/perl
使用Net::Appliance::Session;
$file='1list';
打开(FH,“<$file”)或死亡“无法打开$file进行读取:$!”;
我的@ios_列表=;
关闭FH或die“无法关闭$file:$!”;
chomp(@ios_list);
我的$ios_用户名='xxxx';
我的$ios_密码='xxxx';
设备:
对于我的$ios\u设备\u ip(@ios\u列表){
我的@version\u信息;
我的$proto=shift;
如果(($proto==43)| |($proto==44)){
$tran=“SSH”;
$app=“/usr/local/bin/ssh”;
}否则{
$tran=“Telnet”;
$app=“/bin/telnet”;
}
我的$session\u obj=Net::Appliance::session->new(
主机=>$ios\U设备\U ip,
运输=>$tran,
个性=>“ios”,
);
#间隔
评估{
#尝试登录到ios设备,忽略主机检查
$session_obj->connect(
用户名=>$ios\u用户名,
密码=>$ios\U密码,
#SHKC=>0
);
#获取我们的运行配置
$session\u obj->begin\u privileged;
$session_obj->cmd('conf t');
$session_obj->cmd('aaa授权配置命令');
$session_obj->cmd('exit');
$session_obj->end_privileged;
$session_obj->cmd('write memory');
#结束我们的会议
$session_obj->close;
};
#错误检查
如果($@){
if(UNIVERSAL::isa($@,'Net::Appliance::Session::Exception')){
#来自Net::Appliance::Session的故障描述
print“我们在与设备的Telnet/SSH会话中出错:$ios\u devi
ce_ip\n”;
打印$@->消息。“\n”;
#来自网络的消息::Telnet
打印“Net::Telnet消息:“.$@->errmsg.”\n;
#设备的最后一行输出
打印“设备输出的最后一行:“.$@->最后一行”。\n\n”;
}
elsif(UNIVERSAL::isa($@,'Net::Appliance::Session::Error')){
#来自Net::Appliance::Session的故障描述
打印“在程序执行期间,我们在设备上遇到问题:$ios\U设备\U ip
\n”;
#打印$@->消息。“\n”;
}
否则{
#我们还有一些不是故意创建的异常的错误
打印“访问设备时出现问题:$ios\U设备\U ip\n”;
打印“$ios\U设备\U ip报告的错误为:$@\n”;
}
下一个设备;
}
打印@version\u info;
打印“$ios\U设备\U ip正常\n”;
#结束
}

如果您在连接时遇到问题,在评估后检查$@可能会有所帮助,因为您可能忽略了一个错误

#interace

        eval {
                 # try to login to the ios device, ignoring host check
                $session_obj->connect(
                username => $ios_username,
                password => $ios_password,
                #SHKC => 0
        );
还值得注意的是,这没有任何作用:

     my $proto = shift;
     if (($proto == 43)||($proto == 44)){
           $tran = "SSH";
           $app="/usr/local/bin/ssh";
     }else{
shift
在未填充的
@
上运行,因此
$proto
将始终是
undef