Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ssh/2.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 使用os.forkpty()创建一个伪终端,以ssh方式连接到远程服务器并与之通信_Python_Ssh_Terminal_Fork - Fatal编程技术网

Python 使用os.forkpty()创建一个伪终端,以ssh方式连接到远程服务器并与之通信

Python 使用os.forkpty()创建一个伪终端,以ssh方式连接到远程服务器并与之通信,python,ssh,terminal,fork,Python,Ssh,Terminal,Fork,我正在尝试编写一个python脚本,该脚本可以通过ssh连接到远程服务器,并可以从python客户端执行简单的命令,如ls、cd。但是,在成功地将ssh连接到服务器之后,我无法从伪终端读取输出。有谁能帮我一下,这样我就可以在服务器上执行一些命令了 以下是示例代码: #!/usr/bin/python2.6 import os,sys,time,thread pid,fd = os.forkpty() if pid == 0: os.execv('/usr/bin/ssh',['/usr/

我正在尝试编写一个python脚本,该脚本可以通过ssh连接到远程服务器,并可以从python客户端执行简单的命令,如ls、cd。但是,在成功地将ssh连接到服务器之后,我无法从伪终端读取输出。有谁能帮我一下,这样我就可以在服务器上执行一些命令了

以下是示例代码:

#!/usr/bin/python2.6
import os,sys,time,thread
pid,fd = os.forkpty()
if pid == 0:
    os.execv('/usr/bin/ssh',['/usr/bin/ssh','user@host',])
    sys.exit(0)
else:
    output = os.read(fd,1024)
    print output
    data = output
    os.write(fd,'password\n')
    time.sleep(1)
    output = os.read(fd,1024)
    print output
    os.write(fd,'ls\n')
    output = os.read(fd,1024)
    print output
样本输出:

user@host's password: 

Last login: Wed Aug 24 03:16:57 2011 from 1x.x.x.xxxx

-bash: ulimit: open files: cannot modify limit: Operation not permitted
host: /home/user>ls

我建议尝试模块pexpect,它正是为这类事情而构建的(通过伪tty与其他应用程序接口),或者Fabric,它是为这类事情而构建的,更抽象一些(使用SSH自动化远程服务器上的系统管理任务)

预期:


结构:

如前所述,最好使用公钥。由于我正常使用它们,我已经更改了您的程序,使其在这里工作

#!/usr/bin/python2.6
import os,sys,time,thread
pid,fd = os.forkpty()
if pid == 0:
    os.execv('/usr/bin/ssh',['/usr/bin/ssh','localhost',])
    sys.exit(0)
else:
    output = os.read(fd,1024)
    print output
    os.write(fd,'ls\n')
    time.sleep(1) # this is new!
    output = os.read(fd,1024)
    print output
通过添加
sleep(1)
,我给远程主机(或者,在我的情况下,不是那么远程的主机)时间来处理
ls
命令并生成其输出

如果发送
ls
并立即读取,则只读取当前存在的内容。也许你应该读一个循环左右

或者你应该这样做:

import subprocess
sp = subprocess.Popen(("ssh", "localhost", "ls"), stdout=subprocess.PIPE)
print sp.stdout.read()

您在此处尝试执行的操作最好使用公钥,至少是密码部分。我猜您可能还没有听说过?>>如果您发送ls并立即读取,您将只读取当前显示的内容。也许你应该在循环中阅读。谢谢glglgl,但在连续循环中阅读时,进程会在os处卡住。读取代码输出中的代码片段=os.read(fd,1),而输出:output=os.read(fd,1)#似乎一直在等待这是另一个问题。尝试将fd设置为非阻塞,可能会有所帮助。或者使用
select()