2010-08-14 8 views
13

Der folgende Code läuft grep in einer Maschine über SSH und druckt die Ergebnisse:Erstellen mehrerer SSH-Verbindungen zu einer Zeit mit paramiko

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() 

Wie kann ich grep fünf Maschinen auf einmal (so, dass ich nicht tun haben Sie große Verzögerung), dann setzen Sie all das in fünf Variablen und drucken sie alle aus.

Antwort

25

Sie müssen die Aufrufe in separate Threads (oder Prozesse, aber das wäre Overkill) setzen, was wiederum erfordert, dass der Code in einer Funktion (was eine gute Idee ist sowieso: haben Sie keinen wesentlichen Code auf der obersten Ebene eines Moduls).

Zum Beispiel:

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() 

Wenn Sie viel mehr als fünf Hosts hätten, würde ich anstelle eine „Thread-Pool“ Architektur und eine Warteschlange von Arbeitseinheiten empfehlen. Aber für nur fünf ist es einfacher, beim "dedicated thread" -Modell zu bleiben (besonders, da es keinen Thread-Pool in der Standard-Bibliothek gibt, so dass Sie ein Paket von Drittanbietern wie threadpool ... oder eine Menge subtiler Custom benötigen eigener Code natürlich ;-).

+0

Ich habe 1 Maschine, so dass ich nur 4. Ich habe vergessen zu erwähnen, dass alle Daten später im Skript verarbeitet werden und wie ich Ihren Code verstehen kann (ich bin PyN00b) es wird alle Daten von allen Maschinen auf einmal drucken, aber wie kann ich Daten gerade von einem Wirt dann verarbeiten? Und alle Hosts haben unterschiedliche Pass so kann ich sie alle in workon()? Ty für schnelle Wiederholung Alex. Mit freundlichen Grüßen – Whit3H0rse

+1

@konjo, können Sie die Verarbeitung der Daten in dem Thread, der gerade die Daten erhalten hat - ich habe stattdessen 'print' es getan, nur weil das ist, was * Sie * in Ihrer Frage getan hat. Die Verarbeitung kann natürlich eine Überprüfung des Wertes von "Host" beinhalten, wenn Sie unterschiedliche Verarbeitungen für unterschiedliche Werte davon durchführen müssen. Oder Sie könnten mehrere Funktionen schreiben, die in Ihren Threads als 'target =' verwendet werden: Es gibt keine Einschränkung, dass alle Threads dieselbe Funktion ausführen müssen! –

+0

Oke ich konnte alle 4 Maschinen grep, aber jetzt sind alle Daten zusammengeführt. Wie kann ich Daten von jedem einzelnen Host extrahieren, können Sie mir ein Beispiel geben, bitte erweitern Sie das obige Beispiel? Grüße – Whit3H0rse

-1

Führen Sie einfach alles in einer for-Schleife aus, und vergessen Sie nicht, stdin zu schließen, bevor Sie mit der nächsten Iteration fortfahren. Das heißt, nach Zeile stdin.flush() Zeile hinzufügen stdin.close()

Verwandte Themen