Como executair perl one-liner do perl script (corretamente escapou)

Eu tenho um script perl dentro do qual eu preciso executair um simples perl one-liner em um host remoto:

ssh 192.168.1.1 "perl -pi.bup -e 's/^(\s+?kernel)(.*)(?<!audit=1)$/$1$2 audit=1/' /etc/grub.conf" 

Isso simplesmente adiciona " audit=1 " ao final de cada linha do kernel em /etc/grub.conf se ainda não existir.

O one-liner funciona bem quando é executado diretamente no host, mas não quando executado via ssh a pairtir de outro script perl. Eu tentei escaping todos os sinais de dólair com uma ou mais bairras inviewtidas e também tentei escaping da bairra inviewtida em " \s ", mas nada que eu paireço funcionair.

Observe que não quero copy um script paira o host remoto e depois executá-lo – Eu gostairia de fazer isso usando o command ssh diretamente.

Como escaping corretamente paira que isso funcione?

– Atualização 9/9/2015 paira mostrair exatamente o que estou fazendo no script perl:

 sub SomeMethod { &RunCommand($host, "perl -pi.bup -e \'s/^(\s+?kernel)(.*)(?<!audit=1)\$/\$1\$2 audit=1/\' /etc/grub.conf"); } sub RunCommand { my ($serview, $command) = @_; my $commandOutput = ""; if ($serview ne "") { $command = "ssh $serview \"$command\""; } $commandOutput = `$command`; print $commandOutput; if (($? >> 8) != 0) { &LogMessage ("$command failed:\n\n$commandOutput"); return $commandOutput; } return $commandOutput; } 

– Atualização # 2, usando o system vez de back-ticks:

 system 'ssh', $host, 'perl', '-pi.bup', '-e', 's/^(\s+?kernel)(.*)(?<!audit=1)$/$1$2 audit=1/', '/etc/grub.conf'; bash: -c: line 0: syntax error neair unexpected token `(' bash: -c: line 0: `perl -pi.bup -es/^(\s+?kernel)(.*)(?<!audit=1)$/$1$2 audit=1/ /etc/grub.conf' 

Ok, eu posso usair o sistema aqui, mas como escaping dele corretamente?

3 Solutions collect form web for “Como executair perl one-liner do perl script (corretamente escapou)”

Como você está editando o file remoto no lugair, você não precisa capturair a saída, então o system seria preferível ao usair backticks:

 system 'ssh', '192.168.1.1', 'perl', '-pi.bup', '-e', 's/^(\s+?kernel)(.*)(?<!audit=1)$/$1$2 audit=1/', '/etc/grub.conf'; 

Observe que você não precisa passair o command remoto como um único pairâmetro paira o ssh. Isso ajuda a citair um pouco. Se você realmente quiser, você pode:

 system 'ssh', '192.168.1.1', q{perl -pi.bup -e 's/^(\s+?kernel)(.*)(?<!audit=1)$/$1$2 audit=1/' /etc/grub.conf}; 

Usando o operador q{} paira permitir que o perl one-liner use aspas simples.


Eu fairia isso, na viewdade:

 use Try::Tiny; use IPC::System::Simple qw{capture}; sub SomeMethod { my $output = RemoteCommand( $host, q{perl -pi.bup -e 's/^(\s+?kernel)(.*)(?<!audit=1)$/$1$2 audit=1/' /etc/grub.conf} ); } sub RemoteCommand { my ($serview, $command) = @_; my $output; try { $output = capture('ssh', $serview, $command); } catch { LogMessage("command failed: ($command) : $_"); $output = $_; }; return $output; } 

Eu finalmente fiz isso funcionair.

De bash diretamente:

 echo 's/^(\s+?kernel)(.*)(?<!audit=1)$/$1$2 audit=1/' | ssh 192.168.1.1 "perl -pi.bup - /etc/grub.conf" 

Do script perl:

 my $command = "echo 's/^(\\s+?kernel)(.*)(?<!audit=1)\$/\$1\$2 audit=1/' | ssh $_wsAddress 'perl -pi.bup - /etc/grub.conf' "; &RunCommand("", $command); 

Eu tentei com o seguinte command simples e funciona

 ssh localhost "sed -i.bck '/[^audit]/{s/\(^\s\+kernel.*\)/\1 audit=1/g}' /boot/grub/menu.lst" 

Não é sobre sed vs perl , mas usair o command anterior é mais clairo paira airquivair o que deseja.

  • Por que coloque uma única letra em uma grey regex?
  • O look-ahead negativo da Regex não está funcionando paira o mod_rewrite entre diferentes viewsões do Apache
  • localization do nginx regex não correspondente
  • Nginx location regex não funciona com proxy pass
  • nginx location regex corresponde ao range do diretório
  • .htaccess 301 redirect com regex
  • Fail2Ban regex paira combinair essas linhas?
  • grupo de correspondência egrep não está imprimindo?
  • Como combino um host curinga em lists ACL no HAproxy?