何时对 Python 子进程模块使用 Shell=True [重复]

Posted

技术标签:

【中文标题】何时对 Python 子进程模块使用 Shell=True [重复]【英文标题】:When to use Shell=True for Python subprocess module [duplicate] 【发布时间】:2015-08-30 02:11:22 【问题描述】:

似乎每当我尝试使用 Python 的 subprocess 模块时,我发现我仍然不明白一些东西。目前,我正在尝试从 Python 模块中加入 3 个 mp4 文件。

当我尝试时

z ='MP4Box -cat test_0.mp4 -cat test_1.mp4 -cat test_2.mp4 -new test_012d.mp4'
subprocess.Popen(z,shell=True)

一切正常。

当我尝试时

z = ['MP4Box', '-cat test_0.mp4', '-cat test_1.mp4', '-cat test_2.mp4', '-new test_012d.mp4']
subprocess.Popen(z,shell=False)

我收到以下错误:

Option -cat test_0.mp4 unknown. Please check usage

我认为对于shell=False,我只需要提供一个列表,其中第一个元素是我想要运行的可执行文件,每个后续元素都是该可执行文件的参数。我的这种看法是错误的,还是有正确的方法来创建我想使用的命令?

另外,在 subprocess.Popen 中使用Shell=True 有什么规则吗?到目前为止,我真正知道的(?)是“不要这样做 - 你可以将你的代码暴露给 Shell 注入攻击”。为什么Shell=False 会避免这个问题?使用 'Shell=True` 有实际优势吗?

【问题讨论】:

尝试使用shlex.split 正确标记arg,如here 中的示例 @Ami Tavory - 谢谢,我认为这确实回答了我的问题。但是,可以肯定的是,当shell=True 时,shell 程序将解析 cmd 字符串。因为 shell 程序是非常通用的,所以它会接受和执行比我预期的要多得多的命令,因为它可能意味着只处理一个非常特定的命令及其选项。 shell=False 和 shlex 的使用将执行的字符串集限制为更接近我的特定用例。这是正确的理解吗? 【参考方案1】:

如果shell是True,指定的命令将通过shell执行。 如果您将 Python 主要用于它在大多数系统 shell 上提供的增强控制流,并且仍然希望方便地访问其他 shell 功能,例如 shell 管道、文件名通配符、环境变量扩展和将~ 扩展为用户的主目录。

shell=True 何时有危险?

如果我们执行的 shell 命令可能包含来自不受信任来源的未经处理的输入,它会使程序容易受到 shell 注入的攻击,这是一个严重的安全漏洞,可能导致任意命令执行。因此,在命令字符串是从外部输入构造的情况下,强烈建议不要使用shell=True

例如。 (取自docs)

>>> from subprocess import call
>>> filename = input("What file would you like to display?\n")
What file would you like to display?
non_existent; rm -rf / #
>>> call("cat " + filename, shell=True) # Uh-oh. This will end badly..

【讨论】:

【参考方案2】:

您必须将每个参数作为列表的一个元素:

z = ['MP4Box', '-cat', 'test_0.mp4', '-cat', 'test_1.mp4', '-cat', 'test_2.mp4', '-new', 'test_012d.mp4']
subprocess.Popen(z,shell=False)

这通常是您想要做的,因为您不需要在文件名中转义 shell 的特殊字符。

【讨论】:

以上是关于何时对 Python 子进程模块使用 Shell=True [重复]的主要内容,如果未能解决你的问题,请参考以下文章

在 Python 子进程模块中过滤掉需要终端的命令

python子进程中shell = True或False之间的区别[重复]

如何为python安装子进程模块?

如何在asyncio python中使用子进程模块限制并发进程数

管道时在python的子进程模块中使用stdout.close()

python子进程模块subprocess详解与应用实例 之三