2010-06-26 82 views
1

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

# 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; 
    } 
} 

回答

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; 
    } 
} 

我的版本充分利用了Perl的open功能,可以“打开”命令,并从该命令的输出是作为输入到脚本的事实。

----编辑

关于你的后续问题,如果该文件在多台主机的同一个地方存在,那么你可以围绕交换参数顺序,并通过在命令主机列表-line:

# 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); 
} 
+0

谢谢格兰特。我测试了这个。这很好用!说,我有一个主机列表,例如host1,host2,host3。什么是一次性通过所有这些干净的方法? hostnames.txt: host1 host2 host3 – jdamae 2010-06-27 05:20:37

+0

@ jaedre619 - 请参阅上面的修改 – 2010-06-27 21:51:49

3

前提是你的Perl脚本已经在远程服务器上的地方,只是调用ssh someserver /path/to/the.script.pl。远程stdout和stderr被传回给你。

+0

这将工作。谢谢你的回答。 :-) – jdamae 2010-06-26 22:32:21

相关问题