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



我正在使用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连接)。这样的选择存在吗?

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

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

使用Net:: SFTP:外国:

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;

最新更新