试图弄清楚如何用双引号内的单引号单引号。这就是我要做的事情......
从perl,我想运行一个系统命令...... - ssh进入远程机器 - 执行'正常运行时间'然后从中取出最后一个字段(平均负载持续15分钟)。
\#\!/usr/bin/env perl
my $cmd = "ssh othermachine 'uptime | awk '{print $NF}'' > local_file.dat";
system($cmd);
当然这不会运行......
% ./try.pl
Missing }.
%
缺少"}" ???看起来它将$ NF}解释为var?我试图逃避{}字符而没有运气。我试图逃避$,没有运气。我在}之前尝试了一个空格,没有运气但是不同的msg(未定义的变量)。
c-shell BTW并提前感谢!
答案 0 :(得分:5)
您希望以下内容成为ssh
的第二个参数:
uptime | awk '{print $NF}'
为此,您只需在其周围放置单引号即可。但这不起作用,因为它包含单引号。
您想要构建一个包含$NF
的字符串,但您按如下方式执行:
"...$NF..."
这会将(不存在的)Perl变量$NF
的值放在字符串中。
一步一步地做。
静态:
远程命令:
uptime | awk '{print $NF}'
本地命令:
ssh othermachine 'uptime | awk '\''{print $NF}'\''' >local_file.dat
字符串文字:
my $local_cmd = q{ssh othermachine 'uptime | awk '\''{print $NF}'\''' >local_file.dat}
动态:
use String::ShellQuote qw( shell_quote );
my $remote_cmd = q{uptime | awk '{print $NF}'};
my $local_cmd = shell_quote('ssh', 'othermachine', $remote_cmd) . ' >local_file.dat';
答案 1 :(得分:0)
使用Net::OpenSSH并让它为您做引用:
use Net::OpenSSH;
my $ssh = Net::OpenSSH->new($othermachine,
remote_shell => 'tcsh');
$ssh->system({stdout_file => 'local_file.dat'},
'uptime', \\'|', 'awk', '{print $NF}')
or die "ssh command failed: " . $ssh->error;