为什么Python的subprocess
模块默认情况下期望参数为列表吗?为什么带空格的字符串(类似于正常运行命令时在终端中输入的内容)不是默认输入?有很多资料解释了如何将命令的空格分隔字符串传递到subprocess
,但不太清楚为什么默认值不是相反。
TL;DR 使用列表会绕过 shell,这样您就不必担心 shell 以您不希望的方式解释动态构造的命令行。
假设您有一个非常简单的命令:echo foo
。如下,同时使用字符串和列表:
Popen("echo foo", shell=True)
Popen(["echo", "foo"])
还没有太大区别。现在假设参数包含引号来保护空格和/或 shell 模式,echo "foo * bar"
:
Popen("echo \"foo * bar\"", shell=True)
Popen(["echo", "foo * bar"])
是的,我可以使用单引号来避免需要转义双引号,但您可以看到列表形式开始具有优势。现在假设我没有该命令的文字参数,但它存储在变量中。Now你想用哪个...
This?
Popen('echo "%s"' % (x,), shell=True)
or this?
Popen(["echo", x])
如果您回答“第一个”,则这是x
:
x = "\";rm -rf \""
您刚刚执行的命令是echo ""; rm -rf/""
。您需要确保值中存在任何特殊字符x
在将其合并到您正在构建并传递给 shell 的字符串之前,首先对其进行转义。
或者您只使用一个列表并完全避免使用 shell。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)