Bash Net::OpenSSH命令远程多管道
我尝试在远程linux中使用Perl和模块Net::OpenSSH运行multi命令时遇到问题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
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}'");