在Popen的文档中,我读到了:
class subprocess.Popen(args,bufsize = 0,...)
args应该是一系列程序参数,否则就是一个 串。 [...]除非另有说明,否则建议通过args 作为序列。
为什么建议使用args序列?我必须使用单个字符串的情况是什么?
答案 0 :(得分:1)
在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
使用args序列有助于避免此类漏洞。