Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/331.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 将不分配伪终端错误-ssh-sudo-websocket-subprocess_Python_Bash_Ssh_Terminal_Client Server - Fatal编程技术网

Python 将不分配伪终端错误-ssh-sudo-websocket-subprocess

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)

我基本上想创建一个网页,通过这个网页,可以访问服务器端的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)
然后在下面的函数中,在一个单独的线程
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
是一种方法。