1

入力パラメーターを指定してローカルで動作する次の perl スクリプトがあります。既に ssh キーを正常にセットアップしていることを考えると、同じ情報を取得するためにリモート サーバーにアクセスするためのスクリプトが必要です。リモート サーバー上のログ ファイルのパスは、ローカルと同じです。リモート サーバーの構成は同じです。複数のサーバーで実行し、データを端末またはファイルに戻すだけです。これをシェルスクリプトに入れる必要がありますか?

# 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 に答える