2010-08-14 19 views
13

El siguiente código se ejecuta grep en una sola máquina a través de SSH e imprime los resultados:La creación de múltiples conexiones SSH a la vez usando 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() 

Como puedo GrEP cinco máquinas de una sola vez (para que no lo hago tienen un gran retraso), que ponen todo eso en cinco variables y las imprimen todas.

Respuesta

25

Tendrá que poner las llamadas en hilos separados (o procesos, pero eso sería overkill) que a su vez requiere que el código esté en una función (que es una buena idea de todos modos: no tienen código sustancial en el nivel superior de un módulo).

Por ejemplo:

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

Si tuviera muchos más de cinco ejércitos, yo recomendaría usar en su lugar una arquitectura de "grupo de subprocesos" y una cola de unidades de trabajo. Pero, por solo cinco, es más sencillo seguir el modelo de "hilo dedicado" (especialmente porque no hay un grupo de hilos en la biblioteca estándar, por lo que necesitaría un paquete de terceros como threadpool ... o muchos adornos sutiles código propio, por supuesto ;-).

+0

Eliminé 1 máquina, por lo que solo necesito 4. Olvidé mencionar que todos los datos serán procesados ​​posteriormente en el guión y como puedo entender su código (I m PyN00b) imprimirá todos los datos de todas las máquinas a la vez, pero ¿cómo puedo procesar los datos solo desde un host a la vez? Y todos los hosts tienen diferente pase, ¿puedo ponerlos todos en workon()? Ty para una reproducción rápida Alex. Saludos – Whit3H0rse

+1

@konjo, puede realizar el procesamiento de los datos en el hilo que acaba de obtener los datos; en su lugar, '' los imprimí, solo porque eso * * * hizo en su pregunta. El procesamiento, por supuesto, puede implicar controles sobre el valor de 'host ', si necesita realizar un procesamiento diferente para diferentes valores de los mismos. O bien, podría escribir múltiples funciones para usar como 'target =' en sus hilos: ¡no hay restricción de que todos los hilos deben ejecutar la misma función! –

+0

Oke pude grep las 4 máquinas, pero ahora todos los datos se combinan. ¿Cómo puedo extraer datos de cada host individual, puede dar mi ejemplo, por favor amplíe el ejemplo anterior? Saludos – Whit3H0rse

-1

Simplemente ejecute todo en un bucle for, y no olvide cerrar stdin antes de pasar a la siguiente iteración. Es decir, después de la línea stdin.flush() agregar la línea stdin.close()

Cuestiones relacionadas