这是我的脚本:
cmd=(''' ssh $servername /usr/local/bin/pstat $1|awk 'FNR==5 {print $9}' %s ''' %int(var))
p=subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
out, err=p.communicate()
print "err", err
这是错误:
err awk: cmd. line:1: fatal: cannot open file (No such file or directory)
我相信我写得cmd
不好。我错过了什么?
你让shell运行的命令是这样的,它
1234
是一个值var
(作为参数传递给sh -c
):在那里,
$1
扩展为 shell 的第一个参数,但它没有任何参数,所以它消失了。1234
是 的一个参数awk
,它将它作为输入文件的名称,尝试打开它并失败。我假设您希望将值 from
var
作为参数pstat
改为。你有两个选择:要么把你$1
现在的号码放在上面,%s
就像你上面做的那样;或使用$1
, 并var
作为参数传递给Popen
运行的 shell。与
%s
:请注意,这会将变量值放在 shell 命令的中间,因此您需要知道它不包含任何危险的内容。周围有单引号,只有单引号会引起问题。由于您只有一个号码,因此这应该是安全的。
与
$1
:在这里,我们传递一个数组作为 的第一个参数
Popen
,这使得它使用第一个数组元素作为命令行,其余的作为参数给 shell。(即它sh
使用参数-c
、cmdline...
和sh
运行1234
。sh
字符串转到 shell 的$0
。)"$1"
这比以前更安全,因为变量值永远不会与 shell 运行的代码混合(但请注意,出于通常的原因,您需要双引号)。请注意,您需要
servername
在环境中设置该变量才能被 shellPopen
运行扩展。