использовать Perl-скрипт на удаленных серверах и возвращать вывод на локальный терминал или экран - PullRequest
1 голос
/ 27 июня 2010

У меня есть следующий скрипт на 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;
   }
}

Ответы [ 2 ]

3 голосов
/ 27 июня 2010

Если ваш perl-скрипт уже установлен на удаленных серверах, просто вызовите ssh someserver /path/to/the.script.pl.Удаленный stdout и stderr возвращаются к вам.

2 голосов
/ 27 июня 2010

Вы можете изменить сценарий, чтобы в качестве дополнительного аргумента было указано имя сервера.

# 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 может «открыть» команду, а выходные данные команды представлены в качестве входных данных для вашего сценария.

---- редактировать

Что касается вашего дополнительного вопроса, если файл существует в одном и том же месте на нескольких хостах, вы можете поменять порядок аргументов и передать список хостов в командной строке:

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