伪终端不会分配错误-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)

在这样的系统中,我可以将任何命令(lscdmkdir 等)发送到在服务器端工作的 bash并接收他们的输出。但是,当我尝试 运行 ssh xxx@xxx 时,显示错误 pseudo-terminal will not be allocated because stdin is not a terminal

另外,以类似的方式,当我 运行 sudo ... 时,密码提示不会以某种方式发送到客户端,而是出现在服务器脚本的终端上。

我知道expect;但是,仅针对 sudossh 用法,我不想用 expect 搞乱我的代码。相反,我正在寻找可以伪造 sudossh 并将提示重定向到客户端的通用解决方案。

有什么办法可以解决吗?感谢您的想法,谢谢。

我找到了解决方案。我需要的是创建一个伪终端。并且,在 ttyslave 一侧,进行 setsid() 调用以使该进程成为一个新会话,并在其上执行 运行 命令。

详情在这里: http://www.rkoucha.fr/tech_corner/pty_pdip.html