我有一组文件路径:
@files = ('/home/.../file.txt', '/home/.../file2.txt',...);
我有多台远程机器,具有类似的文件结构。如何使用Perl来区分这些远程文件?
我想过使用Perl反引号,ssh
并使用diff,但我遇到sh
的问题(它不喜欢diff <() <()
)。
是否有一种比较至少两个远程文件的良好Perl方式?
答案 0 :(得分: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 Module Net :: SSH :: Perl来运行远程命令。
在Perl核心模块中没有实现Diff,但在CPAN上还有另一个名为Text :: Diff的实现,所以也许它也可以工作。希望这有帮助!
答案 1 :(得分: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');