在子进程命令中没有 shell=True 时无法执行 运行 命令

Unable to run command without shell=True in subprocess command

我正在 Linux 中使用 python 开发一个小工具。早些时候我使用的是 Python 2.7,但现在我将其更改为 Python 3.4,以查看它是否可以帮助解决我的问题。当我给出以下代码时:

try:
    x=subprocess.check_output(command, shell=True, timeout=3)
except subprocess.TimeoutExpired as exc:
    print ("Timeout bro")
    exit()
except Exception as e:
    msg = "Some issues in fetching details"
    print (msg)

由于该命令从另一台设备获取详细信息并且该设备未正常运行,它在 3 秒后超时并打印消息 "Timeout bro"。我阅读了使用 shell=True 的安全问题,因此我将其设为 shell=False 一次,第二次我删除了该参数。

try:
    x=subprocess.check_output(command, shell=False, timeout=3)
except subprocess.TimeoutExpired as exc:
    print ("Timeout bro")
    exit()
except Exception as e:
    msg = "Some issues in fetching details"
    print (msg)

我在多个地方读到该命令与 shell=False 一起使用同样有效。但是一旦我 运行 上面的代码与 shell=False 代码直接打印 "Some issues in fetching details" 而无需等待 3 秒。有什么方法可以 运行 没有 shell=True 的代码吗?请帮忙。谢谢!

尝试用 command.split() 拆分命令。字符串在 shell=True 的情况下有效,但对于 shell=False 它需要一个参数列表。但是,请注意拆分在某些情况下不起作用,例如路径中有 space 等。我建议在这种情况下使用 shlex

当使用shell=True时,command可能是一个字符串。当使用 shell=False 时,command 应该是一个字符串列表,第一个字符串是可执行文件,随后的字符串是要传递给可执行文件的参数。

您可以尝试将命令拆分为 shlex.split:

import shlex
x = subprocess.check_output(shlex.split(command), shell=False, timeout=3)

默认情况下,当 posix=True 时,shlex.split 会删除反斜杠。因此,如果 shlex.split 不适用于您的 command,您可能需要使用 posix=False 或手动拆分命令。