在python中发送命令行命令最简单,最可靠的方法是什么,并打印stdout和stderr?

时间:2017-04-19 14:14:12

标签: python linux websocket raspberry-pi

详细说明我在做什么:

我想为我的Raspberry Pi创建一个基于Web的CLI。我想带一个websocket并将它连接到这个Raspberry Pi脚本,这样我在网页上输入的文本将直接输入到raspberry pi上的CLI中,响应将在网页上返回给我。

我的第一个目标是创建python脚本,该脚本可以正确地将用户输入的命令发送到CLI并返回CLI中的所有响应。

3 个答案:

答案 0 :(得分:0)

如果您只需要返回值,可以使用os.system,但是您将无法获得stdout和stderr的输出。因此,您可能必须使用subprocess模块,该模块要求您首先将输入文本拆分为命令和参数。

答案 1 :(得分:0)

听起来您正在寻找标准库中的python subprocess模块。这将允许您从python脚本与CLI进行交互。

答案 2 :(得分:0)

subprocess模块将为您完成此操作,但有一些怪癖。您可以将文件对象传递给各种调用以绑定到stderrstdout,但它们必须是真正的文件对象。 StringIO并没有削减它。

下面使用check_output()为我们抓取stdout并保存我们打开文件。我确信有更好的方法可以做到这一点。

from tempfile import TemporaryFile
from subprocess import check_output, CalledProcessError


def shell(command):
    stdout = None

    with TemporaryFile('rw') as fh:
        try:
            stdout = check_output(command, shell=True, stderr=fh)

        except CalledProcessError:
            pass

        # Rewind the file handle to read from the beginning
        fh.seek(0)
        stderr = fh.read()

    return stdout, stderr


print shell("echo hello")[0]
    # hello
print shell("not_a_shell_command")[1]
    # /bin/sh: 1: not_a_shell_command: not found

正如其他海报提到的那样,你应该真正清理你的输入以防止安全漏洞(并删除shell=true)。说实话,你的项目听起来像是故意为自己构建一个远程执行漏洞,所以它可能并不重要。