将 python 变量传递到 shell 脚本中

将 python 变量传递到 shell 脚本中

这是我的脚本:

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使用参数-ccmdline...sh运行1234sh字符串转到 shell 的$0。)

这比前一个更安全,因为变量值永远不会与 shell 运行的代码混合(但请注意,"$1"由于通常的原因,您需要双引号)。

请注意,您需要servername在环境中设置该变量才能通过 shellPopen运行进行扩展。

相关内容