2014-12-15 2 views
1

Perl 및 Module Net :: OpenSSH를 사용하여 원격 Linux에서 다중 명령을 실행하는 데 문제가 있습니다. .다중 파이프 라인으로 원격 Net :: OpenSSH 명령

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}' ' ;;;

어떤 아이디어 나 제안, 감사합니다. 두 번째 행의 시작에있을 파이프 문자를 일으키는, 당신이 당신의 $file 문자열의 끝에서 줄 바꿈이 있다면 당신이 얻을하려는 오류 메시지처럼 보이는

FCS

답변

0

아마도 인용 오류입니다. 그냥 인터넷하자 :: OpenSSH를이 당신을 위해 인용 돌봐 : 그들이 원격 쉘에 인용 부호가 전달되도록 파이프 (|가) 이중 참조로 전달하는 방법을

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

참고. 모듈 문서에는 인용 섹션이 있습니다.

+0

너무 많은 사람을 감사합니다! –

0

은 (시작으로 해석 두 번째 명령의).

bash -c 'echo foo 
      | cat' 

그래서 나는 버그가 정말 $file = "file.log.gz" 발생하지 않으며, 당신의 진짜 $file 무엇이든, 당신이 그것을 씹는해야 할 것 같아요 :

이 테스트는 같은 오류가 deomstrates.

더 큰 미스테리는 왜 bash가 오류가 -c의 1 번 줄에 있다고 말합니다. ash, ksh 및 zsh은 모두 2 행에서 정확하게보고합니다.

관련 문제