Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 一个电报机器人,通过一个交互式外壳控制一个树莓圆周率_Python_Bash_Raspberry Pi_Telegram Bot_Interactive Shell - Fatal编程技术网

Python 一个电报机器人,通过一个交互式外壳控制一个树莓圆周率

Python 一个电报机器人,通过一个交互式外壳控制一个树莓圆周率,python,bash,raspberry-pi,telegram-bot,interactive-shell,Python,Bash,Raspberry Pi,Telegram Bot,Interactive Shell,我正试图为一个电报机器人编写程序来控制我的Raspberry Pi,这样我发送给机器人的每一条消息都将被解释为一个shell命令[1][2] 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

我正试图为一个电报机器人编写程序来控制我的Raspberry Pi,这样我发送给机器人的每一条消息都将被解释为一个shell命令[1][2]

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)
这个机器人工作得很好,但问题是我不能像在真实的shell中那样执行每个命令。我特别谈论的是那些绕过STDOUT并将其输出直接发送到tty的交互式命令(
ssh
ftp
…通常会提示输入密码并等待用户键入密码)。子进程不允许读取或写入tty。事实上,如果我向bot发送命令
tty
,它会回复:
不是tty

此外,一些shell命令会自动更新其输出,或一直运行,直到发生某些事件(例如
ping 8.8.8.8
,或
grep模式
),我也没有成功地复制它们,因为我无法发送
Ctrl+C
Ctrl+D
。请注意,第二个问题是另一个问题,因为可以将ping的输出重定向到文件(而无法重定向用户的
[sudo]密码:
);但在这种情况下,我无法向shell发送输入。
另外,作为一个可选选项,如果机器人能够理解管道、重定向和全局绑定,那将非常有趣。
在我看来,造成这些问题的原因是我无法与外壳互动。我相信解决所有这些问题的办法只有一个

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

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

我:pwd

Bot:/home/user/some/directory

Me:sudo chmod 777 file.txt

Bot:[sudo]用户密码:

我:qwerty

我:嘘user@host

机器人:user@host's密码:

我:qwerty2

机器人:欢迎主持

我:猫

我:你好

机器人:你好

我:测试

机器人:测试

Me:Ctrl+D

附加说明
我已经尝试了Python的pexpect模块,但是我认为它对我来说不是很好,因为我不期望任何特定的输出;我只想得到贝壳给我的任何东西。(也许有一种方法可以做我不知道的我想做的事?
我也尝试过使用fifo文件,但它们不起作用,因为它们连接到标准输入法和标准输出法,而不是tty

[1] 示例:我发送消息
pwd
,bot回复
/working/directory

[2] 是的,我可以使用ssh或类似的语言;然而,让我感兴趣的是,机器人可以独立于执行请求的机器的操作系统工作,无论是Linux、Windows、Android还是其他任何操作系统,而不安装其他软件(甚至不安装电报,因为存在电报网)。

[3] 问题还可能是:如何通过脚本直接连接到tty?如果更容易的话,脚本也可以用bash或其他语言编写。但我不想偏袒你,我对每一个解决方案都持开放态度。一旦我在变量中输入/输出,发送消息就不是问题。

请原谅我回答了我自己的问题,但我已经找到了我想要的,我想与大家分享

在上面的链接中,您可以找到安装和使用“shell bot”的说明;从那里您还可以访问github上的源代码

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


另外,你甚至可以通过机器人运行vim

显然,您需要创建一个tty。搜索
python子流程tty
会产生一些可能的想法,包括.thanky you@larsks。我试图运行该脚本,但它不适合我。它会一直挂起以供输入,直到我按下Ctrl+C。请原谅我,我是个傻瓜。你能简单地解释一下如何创建tty吗?我读了很多问题,但没有一个是有用的。