我想将远程机器的目录复制到本地。为此,我使用的是Net :: OpenSSH perl模块。它工作正常,文件也被复制到我的本地机器。但我想获取复制的文件列表。如何获取文件列表。
我不想使用Net :: SCP。
use Net::OpenSSH;
use Data::Dumper;
my $host='1.1.1.1';
my $credentials={username => 'root', password =>'abc123'};
my $ssh_obj = Net::OpenSSH->new(
$host,
user => $credentials->{username},
password => $credentials->{password},
);
ooen $fh, ">/tmp/abc_scp" or die "$!";
my $opts={recursive => 1, glob => 1, timeout => 100, quiet => 1,stderr_to_stdout => 1,stdout_fh => $fh};
my $op=$ssh_obj->scp_get($opts, "/home/ABC", "/tmp/");
答案 0 :(得分:1)
Net :: OpenSSH scp方法不允许这样做,但还有其他方法:
使用tar
:
$ssh->system({stdout_file => '| (cd /tmp/ && tar xvzf - ) 2>tar.log'},
'(cd /tmp/ABC && tar czf - .)');
然后您必须阅读tar.log
以获取复制的文件列表。
通过Net :: OpenSSH + Net::SFTP::Foreign(或只是Net :: SFTP :: Foreign)使用SFTP:
# untested!
my $ssh = Net::OpenSSH->new(...);
my $sftp = $ssh->sftp;
my @log;
$sftp->rget("/home/ABC", "/tmp",
wanted => sub { push @log, $_[1]->{filenane} },
on_error => sub { push @log if $_[1]->{filename} eq $log[-1] });
使用可以在Net :: OpenSSH上运行的development version Net::SSH::Any:
my $ssh = Net::SSH::Any->new($host, ..., backend => 'Net::OpenSSH');
my @log;
$ssh->scp_get({recursive => 1, action_log => \@log}, "/home/ABC", "/tmp");
Net :: OpenSSH本身并没有实现SCP协议,而是使用OpenSSH scp
二进制文件,遗憾的是它不会返回复制的文件列表。 Net :: SSH :: Any有自己用Perl编写的SCP实现,所以可以做更多的事情。最终,一旦在Net :: SSH :: Any上的SCP实现成熟,我可能会将其反向移植到Net :: OpenSSH。
答案 1 :(得分:0)
您应该考虑仅使用rsync
和无密码基于密钥的ssh,而只需从Perl调用它。它将为您带来以下好处:
您可以执行递归同步并删除旧的本地文件:
rsync -av --delete --progress --partial --stats \
user@host:/src/dir/ dst/dir/
-v
- 详细信息)。--stats
获取一些同步统计信息。--bwlimit
选项限制同步过程使用的网络带宽。rsync
将使用它。