我创建了一个用于连接到多个设备的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
答案 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 ...
也可以)。
记录的选项包括:timeout
,trace
,debug
,compress
和sigpipe
。因此,在构建对象时无法提供主机名。
这是通过connect
my $t = Net::SSH2->new( timeout => 30 ) or $tl = 1;
$t->connect( $hostname ) or $t->die_with_error;
请参阅connect
支持的其他选项的文档。