Python 将不分配伪终端错误-ssh-sudo-websocket-subprocess
我基本上想创建一个网页,通过这个网页,可以访问服务器端的unix终端,向其发送命令,并从终端接收命令结果 为此,我有一个WSGIServer。打开连接后,我将执行以下操作:Python 将不分配伪终端错误-ssh-sudo-websocket-subprocess,python,bash,ssh,terminal,client-server,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)
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)
然后在下面的函数中,在一个单独的线程t
中读取bash
的输出。它只将输出发送到客户端
def listen_stdout(self):
while True:
c = self.p.stdout.read(1)
self.send(c)
在这样的系统中,我能够将任何命令(ls
、cd
、mkdir
等)发送到服务器端工作的bash
,并接收它们的输出。但是,当我尝试运行ssh时xxx@xxx
,将不会分配错误伪终端,因为stdin不是终端
同样,以类似的方式,当我运行sudo…
时,密码提示不会以某种方式发送到客户端,而是显示在服务器脚本的终端上
我知道expect
;然而,仅对于这种sudo
和ssh
用法,我不想用expect
把我的代码弄乱。相反,我正在寻找一种通用的解决方案,它可以伪造sudo
和ssh
并将提示符重定向到客户端
def listen_stdout(self):
while True:
c = self.p.stdout.read(1)
self.send(c)
有什么办法解决这个问题吗?谢谢你的建议 我找到了解决办法。我需要的是创建一个伪终端。并且,在
tty
的slave
一侧,进行setsid()
调用,使该进程成为一个新会话,并在其上运行命令
详情如下:
使用
expect
或使用基于密钥的ssh身份验证
&无密码sudo(危险)没有任何机会获得一个可以与sudo
和ssh
一起运行所有命令的解决方案吗?^^^^是的,shell脚本就是答案。但是如果某个命令期望通过stdin输入,那么您必须以某种方式提供它expect
是一种方法。