详细说明我在做什么:
我想为我的Raspberry Pi创建一个基于Web的CLI。我想带一个websocket并将它连接到这个Raspberry Pi脚本,这样我在网页上输入的文本将直接输入到raspberry pi上的CLI中,响应将在网页上返回给我。
我的第一个目标是创建python脚本,该脚本可以正确地将用户输入的命令发送到CLI并返回CLI中的所有响应。
答案 0 :(得分:0)
如果您只需要返回值,可以使用os.system,但是您将无法获得stdout和stderr的输出。因此,您可能必须使用subprocess模块,该模块要求您首先将输入文本拆分为命令和参数。
答案 1 :(得分:0)
听起来您正在寻找标准库中的python subprocess模块。这将允许您从python脚本与CLI进行交互。
答案 2 :(得分:0)
subprocess
模块将为您完成此操作,但有一些怪癖。您可以将文件对象传递给各种调用以绑定到stderr
和stdout
,但它们必须是真正的文件对象。 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
)。说实话,你的项目听起来像是故意为自己构建一个远程执行漏洞,所以它可能并不重要。