Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash Net::OpenSSH命令远程多管道_Bash_Perl_Perl Module - Fatal编程技术网

Bash Net::OpenSSH命令远程多管道

Bash Net::OpenSSH命令远程多管道,bash,perl,perl-module,Bash,Perl,Perl Module,我尝试在远程linux中使用Perl和模块Net::OpenSSH运行multi命令时遇到问题 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

我尝试在远程linux中使用Perl和模块Net::OpenSSH运行multi命令时遇到问题

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}'");
我得到的结果是:

bash:-c:第1行:意外标记附近的语法错误
|'
bash:-c:第1行:
| tail-n1 | awk'/已成功完成/{print$NF}'' ;;;

任何想法或建议,谢谢

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

Fcs

看起来像是在
$file
字符串末尾有一个换行符时得到的错误消息,导致管道字符位于第二行的开头(解释为第二条命令的开头)

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}'");
此测试将显示相同的错误:

bash -c 'echo foo
           | cat'
所以我想你的bug并不是真的发生在
$file=“file.log.gz”
上,不管你真正的
$file
是什么,你都需要把它吃掉

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

一个更大的谜团是为什么bash说错误出现在
-c
的第1行。ash、ksh和zsh都在第2行正确地报告了它。

可能是引用错误。只需让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}'");
my ($output2, $error2) = $new_connect->capture({ timeout => 10 },
                                               'gunzip', '-c', "/path/to/file/$file", \\'|',
                                               'tail', '-n1', \\'|',
                                               'awk', '/successfully completed/ {print $NF}');
请注意管道(
|
)是如何作为双引用传递的,以便它们以无引号的方式传递到远程shell。模块文档中有一个关于引用的部分

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