0

我正在整理一个 perl 脚本。我在下面捕获了它:

#!/usr/bin/perl
use Tie::File;
use Net::SSH::Expect;
use utf8;
use warnings;
use diagnostics;

# Grab password from hidden file
$pw=`cat .password`;
chomp $pw;

#Read list of 9200's from hosts.list file into an array
tie @hosts, 'Tie::File', "hosts.list" or die;

#Loop through hosts, connect via ssh, run commands, and write out log files.

foreach (@hosts) {

#Create ssh session handle
        my $ssh = Net::SSH::Expect->new (
                host => $_,
                password => $pw,
                user => 'user',
                raw_pty => 1
        );
        my $login_output = $ssh->login();
        if ($login_output !~ /.*sbc.*>/) {
                die "Login failed. Login output was $login_output";
        }
        $ssh->send("show sip errors");
        my $line;
        while ( defined ($line = $ssh->read_line()) ){
                print $line . "\n";
        }
        $ssh->close();
}

首先,我不是程序员,所以风格可能很丑陋。对此感到抱歉:) 目标是在远程设备上运行多个命令,将结果捕获到单独的文件中,然后由第 3 方解析引擎 (splunk) 使用。

当前实现的功能能够登录到远程主机,运行命令,然后打印到标准输出。不完全在那里,但仍然显示了一个很好的概念证明。

该脚本对于 hosts.list 文件中的前 3 个主机运行良好。但是,一旦它到达第四台主机,我就会收到此异常:

Uncaught exception from user code:
    SSHAuthenticationError Login timed out. The input stream currently has the contents bellow: user@myhost.mydomain's password:  at /System/Library/Perl/Extras/5.12/Expect.pm line 828
 at /Library/Perl/5.12/Net/SSH/Expect.pm line 209
    Net::SSH::Expect::__ANON__('ARRAY(0x7fd718a03008)') called at /System/Library/Perl/Extras/5.12/Expect.pm line 828
    Expect::_multi_expect(1, 'ARRAY(0x7fd7189fbce8)', 'ARRAY(0x7fd7189f7460)') called at /System/Library/Perl/Extras/5.12/Expect.pm line 565
    Expect::expect('Expect=GLOB(0x7fd7189f1878)', 1, 'ARRAY(0x7fd718a01530)', 'ARRAY(0x7fd7189f15a8)', 'ARRAY(0x7fd71890a3d0)', 'ARRAY(0x7fd718a07470)', 'ARRAY(0x7fd7189d8b18)') called at /Library/Perl/5.12/Net/SSH/Expect.pm line 580
    Net::SSH::Expect::_sec_expect('Net::SSH::Expect=HASH(0x7fd718a29828)', 1, 'ARRAY(0x7fd718a01530)', 'ARRAY(0x7fd7189f15a8)', 'ARRAY(0x7fd71890a3d0)', 'ARRAY(0x7fd718a07470)', 'ARRAY(0x7fd7189d8b18)') called at /Library/Perl/5.12/Net/SSH/Expect.pm line 213
    Net::SSH::Expect::login('Net::SSH::Expect=HASH(0x7fd718a29828)') called at ./pcscfFetch.pl line 26

关于问题可能是什么的任何想法?我可以通过 ssh 手动登录主机而没有问题。该脚本适用于我们的其他主机,这只是我似乎无法弄清楚的异常值。任何意见,将不胜感激。谢谢!

4

2 回答 2

0

我最终解决了这个问题。在 $ssh 的构造函数中,我将超时设置为 10 秒,而不是默认的 1。脚本运行速度明显较慢,但我似乎没有遇到之前遇到的问题。感谢反馈!

于 2013-08-22T20:20:40.560 回答
0

Net::SSH::Expect 不可靠。

请改用 Net::OpenSSH,或者如果您想在多个主机 Net::OpenSSH::Parallel 中运行相同的命令集。

于 2013-08-26T06:39:07.583 回答