伪终端不会被分配错误 - ssh - sudo - websocket - subprocess

时间:2015-04-20 06:23:25

标签: python bash ssh terminal client-server

我基本上想要创建一个网页,通过该网页可以到达服务器端的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)

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

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

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

有什么方法可以解决这个问题吗?感谢您的想法。

1 个答案:

答案 0 :(得分:0)

我找到了解决方案。我需要的是创建一个伪终端。并且,在slave的{​​{1}}侧,进行tty调用,使此过程成为新会话并在其上运行命令。

详细信息如下: http://rachid.koucha.free.fr/tech_corner/pty_pdip.html