我正在尝试编写一个电报机器人程序来控制我的树莓派,这样我发送机器人的每条信息都应该被解释为一个shell命令[1] [2]。电报机器人通过交互式shell控制树莓派
Raspberry Pi是一个版本2型号B,运行Arch Linux ARM。该程序使用Python 3.6.0与模块Telepot编写,并从Pi执行。
到目前为止,我一直在使用该模块子为了执行命令,就像这样:
# Execute a shell command (assuming that the message received is «text»)
P = subprocess.Popen(text, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True)
# Store the output and the error
(output, error) = P.communicate()
# Send a message with the output
if str(output) != "b''":
bot.sendMessage(my_id, output)
# And another message with the error
if str(error) != "b''":
bot.sendMessage(my_id, error)
僵尸工作得很好,但问题是,我不能执行像每一个命令我会在一个真正的壳。我特别提到绕过STDOUT的交互式命令,并将其输出直接发送到tty(ssh
,ftp
...通常会提示输入密码并等待用户输入密码)。 子进程不允许读取或写入tty。事实上,如果我发送我的机器人命令tty
,它回复:not a tty
。另外,一些shell命令可以更新它们的输出或者继续运行,直到发生某些事件(例如ping 8.8.8.8
或grep pattern
),并且我还没有成功再现它们,因为我无法发送Ctrl+C
或Ctrl+D
。请注意,第二个是另一个问题,因为它可以将ping的输出重定向到一个文件(尽管不可能重定向[sudo] Password for user:
);但在这种情况下,我无法将输入发送到shell。
此外,作为一个可选项,如果机器人可以理解管道,重定向和通配符,将会很有趣。
在我看来,包含这些问题的事实是,我不能用与shell交互。我相信所有这些解决方案都只是一个。
所以问题是,广泛地说,我该如何实现这样一个僵尸程序,允许我通过它运行交互式shell命令[3]?
我想实现的最终结果的一个例子是(在我与机器人之间的对话的形式):
我:PWD
BOT:/首页/ user/some/directory
me:sudo chmod 777文件。TXT
BOT:[须藤]密码用户:
我:QWERTY
我:SSH用户@主机
BOT:用户@ host's密码:
我:qwerty2
BOT:欢迎主办...
或
我:猫
我:你好
BOT:你好
我:测试
BOT:测试
我:按Ctrl + d
P.S.
我已经尝试了用于Python的模块,但我认为它对我来说并不是那么好,因为我不期望任何特定的输出;我只想得到壳给我的任何东西。 (也许有办法做我想做的事,我不知道?)
我也尝试过使用fifo文件,但它们不工作,因为它们连接到STDIN和STDOUT,而不是tty。
[1]例如:我发送消息pwd
和机器人回复/working/directory
。
[2]没错,我可以使用ssh或类似的;然而,令我感兴趣的是,机器人将独立于执行请求的机器的操作系统工作,无论是Linux,Windows,Android还是其他任何软件,无需安装额外的软件(即使安装了电报,因为存在电报网络) 。
[3]问题也可能是:如何通过脚本直接连接到tty?如果脚本更简单,该脚本也可以用bash或其他语言编写。但我不想对你产生偏见,我对任何解决方案都是开放的。一旦我在变量中输入/输出,发送消息不是问题。
你显然需要创建一个tty。搜索'python subprocess tty'会产生一些可能的看法,包括[this](https://gist.github.com/thomasballinger/7979808)。 – larsks
谢谢@larsks。我试图运行该脚本,但它不适合我。它悬于输入不确定,直到我按Ctrl + C。原谅我,但我是一个不错的选择。你能简单地解释一下我如何创建一个tty?我已经阅读了很多问题,但没有一个是有用的。 –