Python-子流程中“shell=True”的实际含义

发布于 2021-02-02 23:23:56

我正在使用该subprocess模块调用不同的进程。但是,我有一个问题。

在以下代码中:

callProcess = subprocess.Popen(['ls', '-l'], shell=True)

callProcess = subprocess.Popen(['ls', '-l']) # without shell

两者都可以。阅读文档后,我知道这shell=True意味着通过外壳执行代码。因此,这意味着在不存在的情况下,该过程将直接启动。

因此,对于我的情况,我更喜欢什么-我需要运行一个流程并获取其输出。从外壳内部或外部调用它有什么好处。

关注者
0
被浏览
378
1 个回答
  • 面试哥
    面试哥 2021-02-02
    为面试而生,有面试问题,就找面试哥。

    不通过外壳调用的好处是你没有在调用“神秘程序”。在POSIX上,环境变量SHELL控制哪个二进制文件作为“外壳”被调用。在Windows上,没有bourne shell后代,只有cmd.exe

    因此,调用外壳程序将调用用户选择的程序,并且该程序与平台有关。一般来说,避免通过外壳调用。

    通过shell调用确实允许你根据shell的通常机制扩展环境变量和文件glob。在POSIX系统上,shell将文件全局扩展为文件列表。在Windows上,无论如何,shell都不会扩展文件glob(例如“ *。*”)(但是cmd.exe 会扩展命令行上的环境变量)。

    如果你认为需要环境变量扩展和文件文件,请研究ILS1992-ish对通过外壳执行子程序调用的网络服务的攻击。示例包括sendmail涉及的各种后门ILS。

    总之,请使用shell=False



知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看