Переменные с s sh и awk с perl - PullRequest
       0

Переменные с s sh и awk с perl

0 голосов
/ 03 февраля 2020

Попытка удаленно выполнить несколько команд в perl сценарии

Это выглядит так:

    $CMD1 = "/usr/sbin/mminfo -av -q \"savetime>'-1 day 18:00:00',savetime<'17:59:59'\" -r \"ssid,totalsize,nfiles,pool\"|grep \"xxxxx\"|/usr/bin/awk '!seen[\$1]++'";
    print Dumper $CMD1;
    $CMD = "/usr/bin/ssh xxxx\@$SRV \'$CMD1\' 2>&1";
    print Dumper $CMD;

Но у меня все еще есть проблема с $ 1 в команде awk, Кажется, он отменяется при запуске.

Что я вижу:

$VAR1 = '/usr/sbin/mminfo -av -q "savetime>\'-1 day 18:00:00\',savetime<\'17:59:59\'" -r "ssid,totalsize,nfiles,pool"|grep "xxxxxx"|/usr/bin/awk \'!seen[$1]++\'';
$VAR1 = '/usr/bin/ssh xxxxx@\'xxxxxx\' \'/usr/sbin/mminfo -av -q "savetime>\'-1 day 18:00:00\',savetime<\'17:59:59\'" -r "ssid,totalsize,nfiles,pool"|grep "xxxxx"|/usr/bin/awk \'!seen[$1]++\'\' 2>&1';

Таким образом, '$ 1' команды awk правильно передается на пульт, но при запуске:

    @RESU = `$CMD`;
    print Dumper @RESU;

Я вижу, что мои $ 1 отсутствуют (или интерпретируются удаленной оболочкой как нулевое значение):

$VAR1 = 'awk: ligne de commande:1: !seen[]++
';
$VAR2 = 'awk: ligne de commande:1:       ^ syntax error
';
$VAR3 = 'awk: ligne de commande:1: error: expression indice non valide
';

Я пробовал много вещей, таких как цитирование или двойные кавычки в строке создание строки с помощью функции perl qq, помещение значения $ CMD1 непосредственно в $ CMD и экранирование кавычек, но никак.

И, конечно, мой awk передается в другой awk (здесь не приводится) ).

Мне не нужно решение, которое запускается awk локально, поскольку я вернул миллионы строк из команды 'mminfo'.

Любая подсказка (или лучший способ сделать это! )?

Ответы [ 2 ]

2 голосов
/ 03 февраля 2020

Возможно, вы захотите разбить его на более мелкие части для удобства чтения и использовать вызов multi-arg system, чтобы избежать perl необходимости порождения оболочки. Функция q() помогает избежать цитирования ада.

$mminfo = q{/usr/sbin/mminfo -av -q "savetime>'-1 day 18:00:00',savetime<'17:59:59'" -r "ssid,totalsize,nfiles,pool"};
$awk = q{/usr/bin/awk '/xxxxx/ && !seen[$1]++');
print Dumper [$mminfo, $awk];

@cmd = ( "/usr/bin/ssh", "xxxx\@$SRV", "$mminfo | $awk" );
print Dumper \@cmd;

system @cmd;
1 голос
/ 08 февраля 2020

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

use strict;
use warnings;
use Net::OpenSSH;

my $quoted_cmd1 = Net::OpenSSH->shell_quote('/usr/sbin/mminfo', '-av',
                       -q => q(savetime>'-1 day 18:00:00',savetime<'17:59:59'),
                       -r => 'ssid,totalsize,nfiles,pool',
                       \\'|',
                       'grep', 'xxxxx',
                       \\'|',
                       '/usr/bin/awk', '!seen[$1]++');

my $SRV = "foo";
my $quoted_cmd = Net::OpenSSH->shell_quote('/usr/bin/ssh', "xxxx\@$SRV",    
                                           $quoted_cmd1,
                                           \\'2>&1');
print "$quoted_cmd\n";

Какие выходы ...

/usr/bin/ssh xxxx@foo '/usr/sbin/mminfo -av -q '\''savetime>'\''\'"''"'-1 day 18:00:00'\''\'"''"',savetime<'\''\'\''17:59:59\'\'' -r ssid,totalsize,nfiles,pool | grep xxxxx | /usr/bin/awk '\''!seen[$1]++'\' 2>&1

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...