1

在给定输入参数的情况下,我有以下在本地工作的 perl 脚本。我需要脚本来访问远程服务器以获取相同的信息,因为我已经成功设置了 ssh 密钥。远程服务器上日志文件的路径与本地相同。远程服务器的配置是相同的。我只需要跨多个服务器运行并将数据带回终端或文件。我需要把它放在一个shell脚本中吗?

# usage example: <this script> Jun 26 2010 <logfile>
use strict;
use warnings;
my ($mon,$day,$year) = ($ARGV[0],$ARGV[1],$ARGV[2]);
open(FH,"< $ARGV[3]") or die "can't open log file $ARGV[3]: $!\n";
while (my $line = <FH>) {
    if ($line =~ /.* $mon $day \d{2}:\d{2}:\d{2} $year:.*(ERROR:|backup-date=|host=|backup-size=|backup-time=|backup-status)/) {
    print $line;
   }
}
4

2 回答 2

3

如果您的 perl 脚本已经在远程服务器上,只需调用ssh someserver /path/to/the.script.pl. 远程 stdout 和 stderr 通过管道返回给您。

于 2010-06-26T21:58:19.553 回答
2

您可以修改脚本以将服务器名称作为额外参数。

# usage example: <this script> Jun 26 2010 <server> <logfile>
use strict;
use warnings;
my($mon,$day,$year,$server,$file) = @ARGV;
open(my $fh,"ssh $server cat $file |") or die "can't open log $server:$file: $!\n";
while (my $line = <$fh>) {
    if ($line =~ /.* $mon $day \d{2}:\d{2}:\d{2} $year:.*(ERROR:|backup-date=|host=|backup-size=|backup-time=|backup-status)/) {
    print $line;
   }
}

我的版本利用了 Perlopen函数可以“打开”命令并且命令的输出作为脚本的输入的事实。

- - 编辑

关于您的后续问题,如果该文件存在于多个主机上的同一位置,那么您可以交换参数顺序并在命令行上传递主机列表:

# usage example: <this script> Jun 26 2010 <logfile> <server> ...
use strict;
use warnings;
my($mon,$day,$year,$file) = @ARGV;
splice(@ARGV, 0, 4, ());            # Discard first 4 args
foreach my $server ( @ARGV ) {
    open(my $fh,"ssh $server cat $file |") or die "can't open log $server:$file: $!\n";
    while (my $line = <$fh>) {
        if ($line =~ /.* $mon $day \d{2}:\d{2}:\d{2} $year:.*(ERROR:|backup-date=|host=|backup-size=|backup-time=|backup-status)/) {
            print $line;
        }
    }
    close($fh);
}
于 2010-06-27T03:23:11.230 回答