2

我有一组文件路径:

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

我有多台远程机器,文件结构相似。如何使用 Perl 区分这些远程文件?

我想过使用 Perl 反引号,ssh并使用 diff,但我遇到了问题sh(它不喜欢diff <() <())。

有比较至少两个远程文件的好 Perl 方法吗?

4

2 回答 2

1

用于rsync将远程文件复制到本地机器,然后用于diff找出差异:

use Net::OpenSSH;

my $ssh1 = Net::OpenSSH->new($host1);
$ssh1->rsync_get($file, 'master');

my $ssh2 = Net::OpenSSH->new($host2);
system('cp -R master remote');
$ssh2->rsync_get($file, 'remote');

system('diff -u master remote');
于 2013-07-10T06:34:44.177 回答
1

您可以使用 CPAN 上名为 Net::SSH::Perl 的 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 来运行远程命令。

Diff 没有在 Perl 核心模块中实现,但在 CPAN 上还有另一个称为 Text::Diff 的方法,所以也许这也可以。希望这可以帮助!

于 2013-07-09T23:03:34.610 回答