python - 子进程中 'shell=True'的实际含义

我正在使用 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/

相关文章:

linux - 删除目录的符号链接(symbolic link)

python - pip 在哪里安装它的包?

linux - 将多个 PDF 文件合并/转换为一个 PDF

python - 如何从 Pandas 数据框中删除行列表?

python - 用一个空格替换非 ASCII 字符

linux - 如何计算文档中的行数?

c - 为什么 C 预处理器将单词 "linux"解释为常量 "1"?

python - 在 Python 中创建一个空列表

linux - 如何将包含文件的文件夹复制到 Unix/Linux 中的另一个文件夹?

python - 如何禁用 Pylint 警告?