Creando múltiples conexiones SSH a la vez usando Paramiko

El siguiente código ejecuta grep en una máquina a través de SSH e imprime los resultados:

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

¿Cómo puedo grep cinco máquinas a la vez (para que no tenga mayor retraso), poner todo eso en cinco variables e imprimirlas todas?

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

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 hosts, recomendaría usar una architecture de “grupo de subprocesos” y una cola de unidades de trabajo. Pero, para solo cinco, es más fácil seguir el modelo de “subproceso dedicado” (especialmente porque no hay un conjunto de subprocesos en la biblioteca estándar, por lo que necesitaría un paquete de terceros como un conjunto de subprocesos … o una gran cantidad de personalización sutil código de su propio, por supuesto ;-).

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() agregue la línea stdin.close()