通过交互式 shell 控制 Raspberry Pi 的 Telegram 机器人

A Telegram bot to control a Raspberry Pi through an interactive shell

我正在尝试为 Telegram 机器人编写程序来控制我的 Raspberry Pi,这样我发送给机器人的每条消息都应被解释为 shell 命令 [1][2] .

Raspberry Pi 是版本 2 模型 B 和 运行s Arch Linux ARM。该程序在 Python 3.6.0 中使用模块 Telepot 编写,并从 Pi 执行。

到目前为止,我一直在使用模块 subprocess 来执行命令,如下所示:

# 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)

机器人工作得很好,但问题是我无法像在真实 shell 中那样执行每条命令。我特别谈论那些绕过 STDOUT 并将其输出直接发送到 tty 的交互式命令(sshftp... 通常会提示输入密码并等待用户输入密码)。 subprocess 不允许读取或写入 tty。事实上,如果我向我的机器人发送命令 tty,它会回复:not a tty.
此外,一些 shell 命令动态更新它们的输出或保持 运行ning 直到某些事件发生(例如 ping 8.8.8.8,或 grep pattern),而我没有成功重现它们都不是,因为我无法发送 Ctrl+CCtrl+D。请注意,第二个是不同的问题,因为可以将 ping 的输出重定向到文件(但不能重定向 [sudo] Password for user:);但在这种情况下,我无法将输入发送到 shell.
此外,作为可选选项,如果机器人能够理解管道、重定向和通配符,那将会很有趣。
在我看来,伴随这些问题的是,我无法 与 shell 互动 。我相信所有这些问题的解决方案只有一个。

所以问题是,从广义上讲,我如何实施这样一个允许我通过它 运行 交互式 shell 命令的机器人程序 [3]?

我想要实现的最终结果的一个示例是(以我和机器人之间的对话形式):

Me: pwd

Bot: /home/user/some/directory

我:sudo chmod 777 file.txt

Bot: [sudo] password for user:

我:qwerty

我:ssh user@host

Bot: user@host´s password:

我:qwerty2

Bot: Welcome to host...

Me: cat

Me: hello

Bot: hello

我:测试

Bot: test

我:Ctrl+D

P.S.
我已经为 Python 尝试了 pexpect 模块,但我认为它对我来说不太好,因为我不期望任何特定的输出;我只想得到 shell 给我的任何东西。 (也许有一种方法可以做我想做但我不知道的事情?)
我也试过使用 fifo 文件,但它们不起作用,因为它们连接到 STDIN 和 STDOUT,而不是 tty。

[1] 示例:我发送消息 pwd 并且机器人回复 /working/directory.
[2] 没错,我可以使用 ssh 或类似工具;然而,令我感兴趣的是,机器人可以独立于执行请求的机器的操作系统工作,无论是 Linux、Windows、Android 还是任何东西,而无需安装额外的软件(甚至无需安装 Telegram,因为存在 Telegram 网络)。
[3] 问题也可能是:如何通过脚本直接连接到 tty?脚本也可以用 bash 或其他语言编写,如果更容易的话。但我不想让你产生偏见,我对每一个解决方案都持开放态度。一旦我在变量中有了 input/output,发送消息就不是问题了。

如果我回答我自己的问题,请原谅我,但我已经找到了我正在寻找的东西,我想与你分享。

https://jmendeth.com/blog/telegram-shell-bot/

在上面的link处可以找到安装使用说明'shell bot';从那里您还可以访问 github.

上的源代码

虽然不是写在Python里,但是写在node.js里,我觉得很完美。它即时更新消息,还可以执行图形命令。

P.S。您甚至可以 运行 vim 通过机器人!