Python 使用os.forkpty()创建一个伪终端,以ssh方式连接到远程服务器并与之通信
我正在尝试编写一个python脚本,该脚本可以通过ssh连接到远程服务器,并可以从python客户端执行简单的命令,如ls、cd。但是,在成功地将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/
#!/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()
。