Warm tip: This article is reproduced from serverfault.com, please click

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

(python - Creating multiple SSH connections at a time using Paramiko)

发布于 2010-08-14 22:43:53

下面的代码通过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()

我如何一次将5台机器全部置入grep(这样就不会造成重大延迟),而不是将所有这些都放入5个变量并将它们全部打印出来。

Questioner
Whit3H0rse
Viewed
11
Alex Martelli 2010-08-15 07:03:28

你需要将调用放在单独的线程(或进程中,但这可能会过大),这反过来又要求代码位于函数中(无论如何,这是一个好主意:在模块的顶部没有大量代码)等级)。

例如:

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 ...或许多微妙的自定义程序)你自己的代码;-)。