伪终端不会分配错误-ssh-sudo-websocket-subprocess
Pseudo terminal will not be allocated error - ssh - sudo - websocket - subprocess
我基本上想创建一个网页,通过它可以访问服务器端的 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
的标准输入,这是一个交互式 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
并将提示重定向到客户端的通用解决方案。
有什么办法可以解决吗?感谢您的想法,谢谢。
我找到了解决方案。我需要的是创建一个伪终端。并且,在 tty
的 slave
一侧,进行 setsid()
调用以使该进程成为一个新会话,并在其上执行 运行 命令。
我基本上想创建一个网页,通过它可以访问服务器端的 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
的标准输入,这是一个交互式 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
并将提示重定向到客户端的通用解决方案。
有什么办法可以解决吗?感谢您的想法,谢谢。
我找到了解决方案。我需要的是创建一个伪终端。并且,在 tty
的 slave
一侧,进行 setsid()
调用以使该进程成为一个新会话,并在其上执行 运行 命令。