我基本上想要创建一个网页,通过该网页可以到达服务器端的unix终端并可以发送命令,并且可以从终端接收结果。
为此,我有一个WSGIServer。打开连接后,执行以下命令:
def opened(self):
self.p = Popen(["bash", "-i"], bufsize=1, stdin=PIPE, stdout=PIPE, stderr=STDOUT)
self.p.stdout = Unbuffered(self.p.stdout)
self.t = Thread(target=self.listen_stdout)
self.t.daemon = True
self.t.start()
当消息从客户端传到服务器时,它在以下函数中处理,该函数仅将即将发送的消息重定向到子进程p
的stdin,这是一个交互式bash
:
def received_message(self, message):
print(message.data, file=self.p.stdin)
然后在单独的线程bash
内的以下函数中读取t
的输出。它只将输出发送给客户端。
def listen_stdout(self):
while True:
c = self.p.stdout.read(1)
self.send(c)
在这样的系统中,我能够将任何命令(ls
,cd
,mkdir
等)发送到服务器端的bash
并接收他们的产出。但是,当我尝试运行ssh xxx@xxx
时,会显示错误pseudo-terminal will not be allocated because stdin is not a terminal
。
此外,以类似的方式,当我运行sudo ...
时,密码提示不会以某种方式发送到客户端,而是显示在服务器脚本的终端上。
我知道expect
;但是,仅针对sudo
和ssh
这样的用法,我不想将代码弄为expect
。相反,我正在寻找可以伪造sudo
和ssh
并将提示重定向到客户端的通用解决方案。
有什么方法可以解决这个问题吗?感谢您的想法。
答案 0 :(得分:0)
我找到了解决方案。我需要的是创建一个伪终端。并且,在slave
的{{1}}侧,进行tty
调用,使此过程成为新会话并在其上运行命令。
详细信息如下: http://rachid.koucha.free.fr/tech_corner/pty_pdip.html