2

ファイルパスの配列があります:

@files = ('/home/.../file.txt', '/home/.../file2.txt',...);

同様のファイル構造を持つ複数のリモートマシンがあります。Perl を使用してこれらのリモート ファイルを比較するにはどうすればよいですか?

私はPerlのバッククォートをssh使用し、diffを使用することを考えましたが、問題がありますsh(好きではありませんdiff <() <())。

少なくとも 2 つのリモート ファイルを比較する適切な Perl の方法はありますか?

4

2 に答える 2

1

Net::SSH::Perl と呼ばれる CPAN 上の Perl モジュールを使用して、リモート コマンドを実行できます。

リンク: http://metacpan.org/pod/Net::SSH::Perl

概要の例:

    use Net::SSH::Perl;
    my $ssh = Net::SSH::Perl->new($host);
    $ssh->login($user, $pass);
    my($stdout, $stderr, $exit) = $ssh->cmd($cmd);

コマンドは次のようになります

    my $cmd = "diff /home/.../file.txt /home/.../file2.txt";

編集: ファイルは別のサーバーにあります。

Net::SSH::Perl を使用してファイルを読み取ることができます。

    #!/bin/perl

    use strict;
    use warnings;
    use Net::SSH::Perl;

    my $host = "First_host_name";
    my $user = "First_user_name";
    my $pass = "First_password";
    my $cmd1 = "cat /home/.../file1";

    my $ssh = Net::SSH::Perl->new($host);
    $ssh->login($user, $pass);
    my($stdout1, $stderr1, $exit1) = $ssh->cmd($cmd1);

    #now stdout1 has the contents of the first file

    $host = "Second_host_name";
    $user = "Second_user_name";
    $pass = "Second_password";
    my $cmd2 = "cat /home/.../file2";

    $ssh = Net::SSH::Perl->new($host);
    $ssh->login($user, $pass);
    my($stdout2, $stderr2, $exit2) = $ssh->cmd($cmd2);

    #now stdout2 has the contents of the second file

    #write the contents to local files to diff

    open(my $fh1, '>', "./temp_file1") or DIE "Failed to open file 1";
    print $fh1 $stdout1;
    close $fh1;


    open(my $fh2, '>', "./temp_file2") or DIE "Failed to open file 2";
    print $fh2 $stdout2;
    close $fh2;

    my $difference = `diff ./temp_file1 ./temp_file2`;

    print $difference . "\n";

このコードはテストしていませんが、次のようなことができます。リモート コマンドを実行するには、Perl モジュール Net::SSH::Perl をダウンロードすることを忘れないでください。

Perl Core Modules には Diff は実装されていませんが、CPAN には Text::Diff という名前の別のものがあるので、それもうまくいくかもしれません。お役に立てれば!

于 2013-07-09T23:03:34.610 に答える