subprocess.Popen:序列与单个字符串
在关于Popen的文档中,我看到:
class subprocess.Popen(args, bufsize=0, ...)
args应该是一个程序参数的序列,或者是一个单独的字符串。[...] 除非另有说明,建议将args作为一个序列传递。
为什么建议使用序列来传递args?在什么情况下我必须使用单独的字符串呢?
1 个回答
2
在Unix系统中,如果你给Popen
传一个字符串作为参数,只有在你不需要给程序传递其他参数时才有效。如果你需要传递参数,就得加上shell=True
。这是因为这个字符串会被当作要执行的程序名称。
使用一个序列(比如列表)来传递参数通常更安全。如果你从用户那里获取程序参数,必须在把它们加到命令字符串之前进行彻底的清理。否则,用户可能会传入任意命令来执行。看看下面这个例子:
>>> def ping(host):
... cmd = "ping -c 1 {}".format(host)
... Popen(cmd, shell=True)
...
>>> ping(input())
8.8.8.8; cat /etc/passwd
使用序列来传递参数可以帮助避免这种安全漏洞。