我有一个python 3脚本,它接受来自用户的输入,这个输入通过管道传输到一个子进程,在那里生成了一个shell。最初我打算将这个代码与套接字放在一起,以便能够制作我自己的非严重远程管理工具,但是这对我目前的级别来说太难了。代码:
import subprocess
p1 = subprocess.Popen(["/bin/sh"], stderr = subprocess.PIPE, stdin = subprocess.PIPE, stdout = subprocess.PIPE, encoding = "utf-8")
command = input("Command: ")
p1.stdin.write(command)
p1.stdout.read()
问题:什么都没打印出来。我搜索了无数个小时 在线有一个原因,多天,但似乎所有这些都没有 工作,和/或建议使用沟通(),这是我不这样做的 想做。如果我能够用a实现这个,那么在思考 socket,我不能在每个命令后关闭进程。我有 在写入之前,在读取之间,之后还尝试过冲洗 阅读,几乎无处不在。应该很简单 够了,我不必深入了解io模块或规则 缓冲(现在太晚了)。几天来我一直在努力奋斗 结束。
答案 0 :(得分:0)
你有几个问题,我会试着画出这条道路,我希望我没有误导你。
首先,免责声明:执行用户输入本质上是不安全的。如果这不是问题,那就让我们继续你的问题。
我会先做
p1 = subprocess.Popen(["/bin/sh"], stderr=subprocess.PIPE, stdin=subprocess.PIPE, stdout=subprocess.PIPE, universal_newlines=True, bufsize=1)
在这种情况下,拥有行缓冲的PIPE是一个好主意。
然后,请记住,您必须在命令后按Enter键,所以:
command = input("Command: ") + "\n"
写是正确的,
p1.stdin.write(command)
但是,阅读是非常危险的,你将很容易陷入僵局。因为stdout
是开放的(没有EOF或类似的东西)你应该保守地阅读,但是,你仍然会遇到问题。
第一个想法是读取行:
p1.stdout.readline()
但是,如果你不知道你能阅读多少行......那就是一个问题。实际上,这个具体问题是has already been asked。
如果您想进行实验,只需打开交互式python解释器,发送"ls\n"
命令并执行readline()
。它会工作,直到你读完最后一行,然后......它将永远等待。这是不好的行为。所以你需要解决这个问题。