2017-02-17 162 views
1

我正在尝试编写一个电报机器人程序来控制我的树莓派,这样我发送机器人的每条信息都应该被解释为一个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.8grep pattern),并且我还没有成功再现它们,因为我无法发送Ctrl+CCtrl+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或其他语言编写。但我不想对你产生偏见,我对任何解决方案都是开放的。一旦我在变量中输入/输出,发送消息不是问题。

+0

你显然需要创建一个tty。搜索'python subprocess tty'会产生一些可能的看法,包括[this](https://gist.github.com/thomasballinger/7979808)。 – larsks

+0

谢谢@larsks。我试图运行该脚本,但它不适合我。它悬于输入不确定,直到我按Ctrl + C。原谅我,但我是一个不错的选择。你能简单地解释一下我如何创建一个tty?我已经阅读了很多问题,但没有一个是有用的。 –

回答

0

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

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

在上面的链接,你可以找到的说明安装和使用“外壳机器人”;从那里你也可以到达github上的源代码。

虽然不是用Python编写的,但是在node.js中,它对我来说似乎很完美。它可以即时更新消息,也可以执行图形命令。

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