通过交互式 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 的交互式命令(ssh
、ftp
... 通常会提示输入密码并等待用户输入密码)。 subprocess 不允许读取或写入 tty。事实上,如果我向我的机器人发送命令 tty
,它会回复:not a tty
.
此外,一些 shell 命令动态更新它们的输出或保持 运行ning 直到某些事件发生(例如 ping 8.8.8.8
,或 grep pattern
),而我没有成功重现它们都不是,因为我无法发送 Ctrl+C
或 Ctrl+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 通过机器人!
我正在尝试为 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 的交互式命令(ssh
、ftp
... 通常会提示输入密码并等待用户输入密码)。 subprocess 不允许读取或写入 tty。事实上,如果我向我的机器人发送命令 tty
,它会回复:not a tty
.
此外,一些 shell 命令动态更新它们的输出或保持 运行ning 直到某些事件发生(例如 ping 8.8.8.8
,或 grep pattern
),而我没有成功重现它们都不是,因为我无法发送 Ctrl+C
或 Ctrl+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 通过机器人!