Python subprocess.Popen:序列与单个字符串

Python subprocess.Popen:序列与单个字符串,python,process,Python,Process,在我的文档中,我读到: 类subprocess.Popen(args,bufsize=0,…) args应该是程序参数序列,或者是单个参数 一串[…]除非另有说明,否则建议通过args 作为一个序列 为什么建议对args使用序列?在什么情况下我必须使用单个字符串?在Unix上,Popen的单个字符串参数只有在不向程序传递参数时才起作用。否则您需要shell=True。这是因为字符串被解释为要执行的程序的名称 使用序列也更安全。如果从用户处获取程序参数,则必须在将其附加到命令字符串之前对其进行完全

在我的文档中,我读到:

类subprocess.Popen(args,bufsize=0,…)

args应该是程序参数序列,或者是单个参数 一串[…]除非另有说明,否则建议通过args 作为一个序列


为什么建议对args使用序列?在什么情况下我必须使用单个字符串?

在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使用序列有助于避免此类漏洞