我正在使用 subprocess
模块调用不同的进程。不过,我有一个问题。
在以下代码中:
callProcess = subprocess.Popen(['ls', '-l'], shell=True)
和
callProcess = subprocess.Popen(['ls', '-l']) # without shell
两者都有效。阅读文档后,我知道 shell=True
意味着通过 shell 执行代码。这意味着在缺席的情况下,直接启动该过程。
那么对于我的情况,我应该更喜欢什么 - 我需要运行一个进程并获取它的输出。从 shell 内部或外部调用它有什么好处。
最佳答案
不通过 shell 调用的好处是您不会调用“神秘程序”。在 POSIX 上,环境变量 SHELL
控制调用哪个二进制文件作为“shell”。在 Windows 上,没有 bourne shell 后代,只有 cmd.exe。
因此调用 shell 会调用用户选择的程序,并且是平台相关的。一般来说,避免通过 shell 调用。
通过 shell 调用确实允许您根据 shell 的通常机制扩展环境变量和文件 glob。在 POSIX 系统上,shell 将文件 glob 扩展为文件列表。在 Windows 上,无论如何,shell 不会扩展文件 glob(例如,“*.*”)(但命令行上的环境变量由 cmd.exe 扩展)。
如果您认为您需要环境变量扩展和文件 glob,请研究 1992 年对通过 shell 执行子程序调用的网络服务的 ILS
攻击。示例包括涉及 ILS
的各种 sendmail
后门。
总之,使用 shell=False
。
https://stackoverflow.com/questions/3172470/