2

我想将一个目录从远程机器复制到本地。为此,我使用 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/");
4

2 回答 2

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 之上运行的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 协议,而是使用 OpenSSHscp二进制文件,遗憾的是它不会返回复制的文件列表。Net::SSH::Any 有自己的用 Perl 编写的 SCP 实现,因此可以做更多的事情。最终,一旦 Net::SSH::Any 上的 SCP 实现变得成熟,我可能会将其反向移植到 Net::OpenSSH。

于 2012-12-13T09:45:45.430 回答
0

您应该真正考虑使用仅rsync基于无密码密钥的 ssh,而只需从 Perl 调用它。它将为您带来以下好处:

  • 第二次和进一步尝试的同步时间非常快。它甚至会重新启动大文件的部分下载。
  • 不太依赖 Perl,或者有时是奇怪的模块行为(不要误会我的意思——我喜欢 Perl,但一切都有它的位置)。
  • 您可以进行递归同步并删除旧的本地文件:

    rsync -av --delete --progress --partial --stats \
          user@host:/src/dir/ dst/dir/
    
  • 您将获得同步文件的列表(使用选项-v- 详细)。
  • 您可以使用 rsync 选项获得一些同步统计信息--stats
  • 您可以使用选项限制同步过程使用的网络带宽--bwlimit
  • 您永远不应该将密码(尤其是 root!)嵌入到您的脚本中。配置无密码 ssh 并更好地睡眠。rsync会利用它。
于 2012-12-11T12:20:51.633 回答