2010-06-26 16 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

相關問題