Perl - /usr/local/lib64/perl5/Net/SSH2.pm中哈希赋值中的奇数元素数

时间:2017-07-24 04:18:45

标签: perl ssh hash

我创建了一个用于连接到多个设备的ssh的perl。我想通过连接设备检查ssh是否正常运行。

这是我的代码:

#!/usr/bin/perl
use strict;
use warnings;
use Net::SSH2;
use POSIX qw(strftime);

my $date = strftime "%Y%m%d", localtime;

open (OUTPUTS, ">ssh_Success$date.log" );
open (OUTPUTF, ">ssh_Fail$date.log" );

open( SWITCHIP, "ip.txt" ) or die "couldn't open ip.txt";

my $count = 0;

while (<SWITCHIP>) {
    chomp($_);
    my $hostname = $_;
    my $tl     = 0;
    my $t      = Net::SSH2->new(
        #Host => $hostname,
        #Prompt =>
            #'/(?m:^(?:[\w.\/]+\:)?[\w.-]+\s?(?:\(config[^\)]*\))?\s?[\$#>]\s?(?:\(enable\))?\s*$)/',
        #debug=>0
        #Timeout => 30,
        #Errmode => 'return'
        '$hostname', timeout => 30
    ) or $tl = 1;

    my @output = ();

    if ( $tl != 1 ) {
        print "$hostname SSH success\n"; # for printing it in screen
        print OUTPUTS "$date $hostname SSH success\n"; # it will print it in the log_Success.txt
    }
    else {
        my $sshstat = "SSH failed";
        print "$hostname $sshstat\n"; # for printing it in screen
        print OUTPUTF "$date $hostname $sshstat\n"; # it will print it in the log_Fail.txt
    }

    $count++;
}
close(SWITCHIP);
close(OUTPUTS);
close(OUTPUTF);

我得到一个奇怪的错误 - 哈希分配中奇数个元素:

Odd number of elements in hash assignment at /usr/local/lib64/perl5/Net/SSH2.pm
1.1.1.1 SSH success
Odd number of elements in hash assignment at /usr/local/lib64/perl5/Net/SSH2.pm
2.2.2.2 SSH success
Odd number of elements in hash assignment at /usr/local/lib64/perl5/Net/SSH2.pm
3.3.3.3 SSH success

3 个答案:

答案 0 :(得分:2)

如果我们忽略注释掉的行,你对Net :: SSH2构造函数的调用归结为:

my $t = Net::SSH2->new(
    '$hostname', timeout => 30
) or $tl = 1;

这是三个参数的列表('$hostname''timeout'30),这是一个“奇数个元素”。

也许你的意思是:

my $t = Net::SSH2->new(
    Host    => $hostname,
    Timeout => 30,
) or $tl = 1;

另请注意,变量替换仅发生在双引号字符串中。在单引号字符串中,$字符只是$。所以'$hostname'似乎可能是一个错误。

答案 1 :(得分:2)

看起来你没有在Net :: SSH2构造函数中命名所有参数。 Perl不像其他语言,其中可选参数可以通过名称传递。当您调用类似于该构造函数的函数时,您的参数将被解释为散列,因此必须将所有键和值指定为对。

根据docs,看起来您可以在构造函数中设置主机名。如果可以,语法将为new(hostname => $hostname, timeout => 30);。因为你不能,只用超时参数调用构造函数,然后设置主机名。

答案 2 :(得分:2)

模块的constructor (new) expects a %hash。这意味着您必须提供包含偶数个元素或散列变量的列表,以便new可以使用它们构建所需的哈希。当一个奇数个元素被分配给一个哈希时,就会打印出一个警告(你得到的)。

提供的列表是选项 - 值对,为方便起见,写为option => value, ...(即使option, value ...也可以)。

记录的选项包括:timeouttracedebugcompresssigpipe。因此,在构建对象时无法提供主机名。

这是通过connect

完成的
my $t = Net::SSH2->new( timeout => 30 ) or $tl = 1;

$t->connect( $hostname ) or $t->die_with_error;

请参阅connect支持的其他选项的文档。