Python子进程中shell=True和False的区别

3

我刚开始使用Python的子进程模块。

subprocess.call("ls", shell = False)subprocess.call("ls", shell = True) 这两行代码都会返回相同的结果。我只是想知道这两个shell选项之间的主要区别。

1个回答

3

来自文档的原话:

如果 shell 参数为 True,则通过 shell 执行指定的命令。这可以很有用,如果你主要使用 Python 来增强对大多数系统 shell 的控制流,并且仍然想方便地访问其他 shell 功能,如 shell 管道、文件名通配符、环境变量扩展和 ~ 扩展到用户的主目录。但请注意,Python 本身提供了许多类似 shell 的功能实现(特别是 glob、fnmatch、os.walk()、os.path.expandvars()、os.path.expanduser() 和 shutil)。

这样会打开你的代码以接受可能存在的 shell 注入技术,这个问题可以在这里更好地解释:

Shell 注入 Shell=True

例如,在 Windows 计算机上,如果 shell 被设置为 false,如下所示:

import subprocess

subprocess.Popen("dir", shell = False)

运行此代码应返回一个“WindowsError:[Error 2]”,指出找不到指定的文件。但是,如果shell为True,则会返回一个对象。这是因为“dir”正在通过cmd“管道”,因此内置命令(如dir)将起作用。
使用subprocess.call也是一样的。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接