这是我的脚本:
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
不好。我缺少什么?
答案1
您让 shell 运行的命令类似于以下内容,其1234
值来自var
(这作为参数传递给sh -c
):
ssh $servername /usr/local/bin/pstat $1|awk 'FNR==5 {print $9}' 1234
在那里,$1
被扩展为 shell 的第一个参数,但它没有任何参数,所以它消失了。1234
是 的一个参数awk
,它将它作为输入文件的名称,尝试打开它但失败。
我假设您希望将值 fromvar
作为参数 to pstat
。您有两个选择:要么将数字放在您$1
现在拥有的位置,就像%s
上面所做的那样;或使用$1
, 并var
作为参数传递给运行的 shell Popen
。
和%s
:
cmd=(''' ssh "$servername" /usr/local/bin/pstat '%s' | awk 'FNR==5 {print $9}' '''
% int(var))
p=subprocess.Popen(cmd, shell=True, ... )
请注意,这会删除 shell 命令中间的变量值,因此您确实需要知道它不包含任何危险的内容。由于单引号引起来,只有单引号才会引起问题。由于您只有一个号码,所以这应该是安全的。
和$1
:
cmd=(''' ssh "$servername" /usr/local/bin/pstat "$1" | awk 'FNR==5 {print $9}' ''')
p=subprocess.Popen([cmd, "sh", str(var)], shell=True, ... )
在这里,我们传递一个数组作为 的第一个参数Popen
,这使得它使用第一个数组元素作为命令行,其余的作为 shell 的参数。 (即它sh
使用参数-c
、cmdline...
和sh
运行1234
。sh
字符串转到 shell 的$0
。)
这比前一个更安全,因为变量值永远不会与 shell 运行的代码混合(但请注意,"$1"
由于通常的原因,您需要双引号)。
请注意,您需要servername
在环境中设置该变量才能通过 shellPopen
运行进行扩展。