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()
Der Prozess immer noch hängt, aber wenn ich 'pool.map ersetzen()' 'mit for' Schleife gut es funktioniert, aber zeitaufwendiger –
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
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() ' –