Perl:在File :: Remote中的单个SSH会话中解析多个文件

时间:2011-07-12 19:33:50

标签: perl

我正在使用File :: Remote模块在Perl中创建一个脚本。该脚本需要解析几个主机中的几个文件(假设每个主机有3个文件)。但是,每次打开文件时,脚本都会通过SSH连接到主机。我的代码如下所示:

my $secure = new File::Remote(rsh => '/usr/bin/ssh', rcp => '/usr/bin/scp');
foreach $host (@hostList)
{
    for ($number = 1; $number < 4; $number++)
    {
        my $logFile = "log_$number.log";
        $secure->open(HANDLE, "$host:/home/$logFile") or die;

        ...
    }
}

因此,如果@hostList数组中有4个主机,则该脚本将尝试12个SSH连接(要解析的文件总数)。然而,我发现这是低效的,我想知道我是否可以做到这一点,它需要每个主机或SSH会话只执行一次SSH连接(所以在这种情况下,总共4个SSH连接)。这样的选择存在吗?

2 个答案:

答案 0 :(得分:0)

foreach $host (@hostlist) {
    @files = map { "/home/log_$_.log" } 1 .. 3;
    open HANDLE, "/usr/bin/ssh $host cat @files |";
    # ... process HANDLE ...
}

(假设远程系统有cat,文件名没有空格或其他shell元字符等。)

答案 1 :(得分:0)

使用Net::SFTP::Foreign

use Net::SFTP::Foreign;

for my $host (...) {
    my $sftp = Net::SFTP::Foreign->new($host, autodie => 1);
    for my $number (1..3) {
        my $fh = $sftp->open("/home/log_$number.log");
        ...
    }

    # or
    $sftp->mget("/home/log_*.log", $local_path);
 }

或者使用Net::OpenSSH::Parallel,您甚至可以并行检索所有主机中的文件:

use Net::OpenSSH::Parallel;
$pssh = Net::OpenSSH::Parallel->new;
$pssh->add_host($_) for @hosts;
$pssh->push('*', 'scp_get', { glob => 1 }, "/home/log_*.log", "$local_path/%HOST%/");
$pssh->run;