Perl - войдите в несколько серверов и grep для ошибки в журналах - PullRequest
0 голосов
/ 08 июня 2018

Я пытаюсь войти на несколько серверов и grep для конкретной ошибки в журналах.Если ошибка найдена, выведите имя хоста сервера и сколько раз ошибка произошла

CODE:

#!/usr/bin/perl
use diagnostics;
use warnings;

my $uid = $ENV{'LOGNAME'};
my $server;
my @hosts = ('server1','server2','server3','server4','server5','server6','server7','server8');
print "Log Date (MM-DD): ";
my $LD8 = <STDIN>;
print "host             Error Occured \n";
print "--------------  ---------------\n";
for each $server (@hosts) {
    open my $tc, 'ssh -q $uid@$server "grep -c 'Error Occured' /home/perry/error.log-$LD8"', or die "could not run";
    while (<$tc>) {
        print "$server      '$_'\n";
    } #--while
} #--for
close $tc;

1 Ответ

0 голосов
/ 09 июня 2018

Этот код:

open my $tc, 'ssh -q $uid@$server "grep -c 'Error Occured' /home/perry/error.log-$LD8"'

Проблематично по ряду причин.Возможно, вы захотите заменить имена переменных $uid, $server и $LD8 содержимым этих переменных.Но строка использует одинарные кавычки - это то, что вы используете, когда вы не хотите, чтобы переменные были интерполированы.Кроме того, строка содержит одинарные кавычки, поэтому она, вероятно, вызывает синтаксическую ошибку.

Чтобы сделать ее более сложной, ваша строка также содержит символы двойных кавычек.Вы можете использовать обратную косую черту, как это:

open my $tc, "ssh -q $uid@$server \"grep -c 'Error Occured' /home/perry/error.log-$LD8\""

Или вы можете использовать оператор qq() в качестве альтернативных двойных кавычек.

open my $tc, qq(ssh -q $uid@$server "grep -c 'Error Occured' /home/perry/error.log-$LD8")

Но проблема все еще существует, потому что эта строкаэто команда, но вы передаете ее open, как если бы это было имя файла, поэтому она все равно не будет работать.Если вы хотите, чтобы open обработал аргумент как команду и запустил его с его STDOUT, присоединенным к каналу, чтобы вы могли читать из канала, чтобы получить вывод команды, тогда вам нужно добавить символ канала (|) как последний символ в строке:

open my $tc, qq(ssh -q $uid@$server "grep -c 'Error Occured' /home/perry/error.log-$LD8" |)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...