subprocess.Popen:sequence vs单个字符串

时间:2014-05-19 16:08:56

标签: python process

Popen的文档中,我读到了:

  

class subprocess.Popen(args,bufsize = 0,...)

     

args应该是一系列程序参数,否则就是一个   串。 [...]除非另有说明,否则建议通过args   作为序列。

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

1 个答案:

答案 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序列有助于避免此类漏洞。