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 プロトコル自体を実装していませんが、scp残念ながらコピーされたファイルのリストを返さない OpenSSH バイナリを使用しています。Net::SSH::Any には、Perl で記述された独自の SCP 実装があり、それを実行したり、より多くのことを実行したりできます。最終的に、Net::SSH::Any での SCP 実装が成熟したら、おそらく Net::OpenSSH にバックポートします。

于 2012-12-13T09:45:45.430 に答える
0

rsync代わりにパスワードなしのキーベースの ssh を使用することを検討し、Perl から呼び出すだけです。次のようなメリットがあります。

  • 2 回目以降の試行で非常に高速な同期時間。巨大なファイルの部分的なダウンロードも再開します。
  • Perl にあまり依存していないか、モジュールの動作がおかしくなることがあります (誤解しないでください。私は Perl が大好きですが、すべてに適切な場所があります)。
  • 再帰的な同期を行い、古いローカル ファイルを削除できます。

    rsync -av --delete --progress --partial --stats \
          user@host:/src/dir/ dst/dir/
    
  • 同期されたファイルのリストを取得します (オプション-v- verbose を使用)。
  • rsync オプションを使用すると、いくつかの同期統計を取得できます--stats
  • オプションを使用して、同期プロセスで使用されるネットワーク帯域幅を制限でき--bwlimitます。
  • パスワード (特に root!) をスクリプトに埋め込むべきではありません。パスワードなしの ssh を構成し、よりよくスリープします。rsyncそれを活用します。
于 2012-12-11T12:20:51.633 に答える