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