2014-12-15 3 views
1

У меня возникла проблема при попытке запуска нескольких команд в удаленном Linux с помощью Perl и Module Net :: OpenSSH. ,Net :: OpenSSH команда remote с несколькими конвейерами

use Net::OpenSSH; 
my $new_connect = Net::OpenSSH->new($D_CONNECT{'HOST'}, %OPT); 
my $file = "file.log.gz" 
my ($output2, $error2) = $new_connect->capture({ timeout => 10 }, "gunzip -c /path/to/file/$file | tail -n1 | awk '/successfully completed/ {print \$NF}'"); 

вывод, что я получаю:

Баш: -c: строка 1: ошибка синтаксиса около неожиданной лексемы |' bash: -c: line 1: | хвост -n1 | AWK '/ успешно/{печать $ NF}'» ;;;

любая идея или предложение, спасибо.

FCS

ответ

0

Возможно, что у вас есть ошибка. Просто пусть Net :: OpenSSH заботиться о процитировать для вас:

my ($output2, $error2) = $new_connect->capture({ timeout => 10 }, 
               'gunzip', '-c', "/path/to/file/$file", \\'|', 
               'tail', '-n1', \\'|', 
               'awk', '/successfully completed/ {print $NF}'); 

Обратите внимание, как трубы (|) передаются в виде двойной ссылки, так что они передаются неупомянуты к удаленной оболочке. Документация модуля содержит раздел о цитировании.

+0

спасибо, много человек! –

0

Это выглядит как сообщение об ошибке вы получите, если у вас есть символ новой строки в конце вашего $file строки, в результате чего характера трубы, чтобы быть в начале второй строки (интерпретируется как начало второй команды).

Этот тест deomstrates ту же ошибку:

bash -c 'echo foo 
      | cat' 

Так я думаю ваша ошибка на самом деле не происходит с $file = "file.log.gz" и независимо от вашего реального $file, вы должны грызть его.

Большая загадка почему bash говорит, что ошибка находится в строке 1 -c. зола, ksh и zsh все правильно сообщают об этом в строке 2.

 Смежные вопросы

  • Нет связанных вопросов^_^