使用Paramiko一次创建多个SSH连接

时间:2010-08-14 22:43:53

标签: python ssh paramiko

下面的代码通过SSH在一台机器上运行grep并打印结果:

import sys, os, string
import paramiko

cmd = "grep -h 'king' /opt/data/horror_20100810*"

ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect('10.10.3.10', username='xy', password='xy')
stdin, stdout, stderr = ssh.exec_command(cmd)
stdin.write('xy\n')
stdin.flush()

print stdout.readlines()

如何一次性使用五台机器(这样我没有大的延迟),而不是把所有这些都放在五个变量中并将它们全部打印出来。

3 个答案:

答案 0 :(得分:33)

你需要将调用放入单独的线程(或进程,但这样就太过分了),这反过来要求代码在一个函数中(无论如何这都是一个好主意:没有实质的代码)模块的顶级)。

例如:

import sys, os, string, threading
import paramiko

cmd = "grep -h 'king' /opt/data/horror_20100810*"

outlock = threading.Lock()

def workon(host):

    ssh = paramiko.SSHClient()
    ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
    ssh.connect(host, username='xy', password='xy')
    stdin, stdout, stderr = ssh.exec_command(cmd)
    stdin.write('xy\n')
    stdin.flush()

    with outlock:
        print stdout.readlines()

def main():
    hosts = ['10.10.3.10', '10.10.4.12', '10.10.2.15', ] # etc
    threads = []
    for h in hosts:
        t = threading.Thread(target=workon, args=(h,))
        t.start()
        threads.append(t)
    for t in threads:
        t.join()

main()

如果您有超过五台主机,我建议使用“线程池”架构和工作单元队列。但是,只有五个,坚持“专用线程”模型更简单(特别是因为标准库中没有线程池,所以你需要第三方软件包,如threadpool ...或者当然,你自己很多微妙的自定义代码; - )。

答案 1 :(得分:0)

在我的情况下,我必须在具有一个IP和端口的服务器上执行命令,并且在完全需要通过sftp到另一个IP和不同的端口后执行条件。条件是由于端口转发,在将sftp到另一个IP时应该保持一个连接。

两个连接都可以单独工作,但是同时将两个第二个sftp连接都不能正常工作。

答案 2 :(得分:-1)

只需在for循环中运行所有内容,并且在继续下一次迭代之前不要忘记关闭stdin。也就是说,在行stdin.flush()之后添加行stdin.close()