2016-04-11 4 views
0

Previous details Ich muss ssh auf einen Switch zu verschiedenen Hosts pingen. Früher habe ich einen Thread für jeden Host gestartet, aber es stellte sich heraus, dass er die maximale SSH-Verbindungsnummer einfach überschritten hat, also habe ich eine interaktive Shell-Sitzung nach this erstellt. Aber wenn ich parallel lief, blieb es dort hängen, nachdem ich den ersten Befehl gesendet hatte. Ich habe keine Ahnung, wie ich das beheben kann.
Simplified Code unten aufgeführt:Wie parallel mit einer SSH-Sitzung mit paramiko

import paramiko 
import time 
from paramiko import SSHClient 
from multiprocessing.dummy import Pool 

def rping(src, user, passwd, dst): 

    def command(des): 
     chan.send('ping -s 64 -t 1500 %s\r\n' % des) 
     time.sleep(3) 
     resp = chan.recv(9999) 
     print resp 

    ssh = SSHClient() 
    ssh.load_system_host_keys() 
    ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) 
    ssh.connect(src, 22, user, passwd, timeout=3) 

    chan = ssh.invoke_shell() 

    pool = Pool() 
    pool.map(command, dst) 
    pool.close() 
    pool.join() 


if __name__ == '__main__': 
    print time.ctime() 

    src = '10.130.1.121' 
    user = 'user' 
    passwd = 'password' 
    dst = ['10.130.1.122', '10.130.1.123', 10.130.1.124''] 
    rping(src, user, passwd, dst) 

    print time.ctime() 

Antwort

0

Beachten multiprocessing.dummy ist eigentlich mit dem threading Modul arbeiten. Gegeben, Ihre command Funktion gibt nichts zurück.

def rping(src, user, passwd, dst): 
    def command(des): 
     chan = ssh.invoke_shell() # new channel 
     chan.send('ping -t 64 -s 1500 -c 3 %s\r\n' % des) 
     time.sleep(3) 
     resp = chan.recv(9999) 
     chan.close() # close channel 
     return resp 

    ssh = SSHClient() 
    ssh.load_system_host_keys() 
    ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) 
    ssh.connect(src, 22, user, passwd, timeout=3) 

    pool = Pool(len(dst)) 
    result = pool.map(command, dst) 
    pool.close() 
    pool.join() 
    ssh.close() # close SSH client 
    return result 
+0

Der Prozess immer noch hängt, aber wenn ich 'pool.map ersetzen()' 'mit for' Schleife gut es funktioniert, aber zeitaufwendiger –

+0

ich sehe, dass Ping Argumente ausgetauscht zu werden scheinen und tatsächlich der Befehl niemals endend. Bearbeitete die Antwort, um es zu beheben, und fügte ein "-c 3" hinzu, so dass nur 3 ICMP-Echo-Anfragen gesendet wurden. – fernandezcuesta

+0

Die Standardanzahl von Paketen ist 5, wenn nicht angegeben. Dieses Skript funktionierte gut in der Serie mit 'for' loop, aber fehlgeschlagen und hängen dort parallel mit' pool.map() ' –