Perl 如何获取由Net::OpenSSH复制的文件列表->;scp_get()方法

Perl 如何获取由Net::OpenSSH复制的文件列表->;scp_get()方法,perl,scp,openssh,Perl,Scp,Openssh,我想将目录从远程计算机复制到本地计算机。为此,我使用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::Open

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

<>你应该考虑只使用<代码> RSyc < /Cord>和无密码的基于密钥的SSH,并简单地从Perl调用它。它将为您带来以下好处:

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

    rsync -av --delete --progress --partial --stats \
          user@host:/src/dir/ dst/dir/
    
  • 您将获得同步文件的列表(使用选项
    -v
    -verbose)
  • 您可以使用rsync选项
    --stats
    获得一些同步统计信息
  • 您可以使用
    --bwlimit
    选项限制同步进程使用的网络带宽
  • 永远不要在脚本中嵌入密码(尤其是root!)。配置更少密码的ssh和更好的睡眠
    rsync
    将使用它

    • 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)使用SFTP:

      • 使用可以在Net::OpenSSH上运行的:

        my $ssh = Net::SSH::Any->new($host, ..., backend => 'Net::OpenSSH');
        my @log;
        $ssh->scp_get({recursive => 1, action_log => \@log}, "/home/ABC", "/tmp");
        
        OpenSSH本身并不实现SCP协议,而是使用OpenSSH
        SCP
        binary,不幸的是,它没有返回复制的文件列表。Net::SSH::Any有自己的用Perl编写的SCP实现,因此可以做到这一点和更多事情。最终,一旦Net::SSH::Any上的SCP实现成熟,我可能会将其向后移植到Net::OpenSSH


      您的
      ooen
      语句中有一个输入错误;)如果启用“verbose=>1”,它将打印其发送的文件。不幸的是,您还必须筛选所有调试语句。我不能使用您的建议,因为我不想使用系统调用。我的某些计算机没有rsync命令。
      my $ssh = Net::SSH::Any->new($host, ..., backend => 'Net::OpenSSH');
      my @log;
      $ssh->scp_get({recursive => 1, action_log => \@log}, "/home/ABC", "/tmp");