Anteriormente se ha visto el uso de PDSH para la ejecución de comandos de forma paralela sobre varios sistemas desde una única ejecución, se han hablado sobre las diferentes perspectivas y usos que se le puede dar a este tipo de herramientas y como realmente simplifican la vida de un administrador (o un hacker) a la hora de realizar operaciones comunes sobre múltiples sistemas, en esta ocasión se utilizará una herramienta que ha sido de las primeras en el área de procesamiento distribuido utilizando SSH, actualmente se encuentra en un estado bastante maduro y su desarrollo ha finalizado en el verano del 2003, no obstante se trata de una herramienta bastante robusta y sencilla que permite ejecutar justo lo que el administrador (o hacker) quiere hacer: Ejecutar comandos de forma paralela sobre un conjunto de sistemas, esta herramienta es FANOUT  la cual se encuentra dividida en dos ejecutables llamados “fanout” y “fanterm”, estas dos herramientas permiten ejecutar cualquier comando UNIX/Linux sobre varias maquinas de forma paralela la diferencia entre estas herramientas esta en que la primera solamente ejecuta comandos no interactivos, mientras que la segunda permite crear una nueva consola sobre las maquinas indicadas y ejecutar comandos que requieren la interacción con el usuario.

USO DE FANOUT Y FANTERM

En primer lugar es necesario descargar la ultima versión que se encuentra disponible (0.6.1) y se puede descargar desde aquí: http://www.stearns.org/fanout/fanout-0.6.1.tar.gz no requiere un proceso de instalación previo como en muchas herramientas escritas en C/C++ en lugar de eso, las herramientas vienen compiladas y listas para su ejecución en ficheros SH (fanout.sh y fanterm.sh).

Por otro lado el uso de estos comandos es realmente muy sencillo, ninguno de estos tiene opciones de ejecución, solamente es necesario indicar el listado de hosts y el comando que se desea ejecutar sobre las mismas, el único requisito (al igual que con PDSH) es que exista una instancia del agente de autenticación de SSH (ssh-agent) y este a su vez tenga incluida la clave privada que le permitirá la autenticación automática con los hosts a los que se pretende ejecutar los comandos de forma paralela (para ver más sobre el uso de ssh-agent y ssh-add ver aquí)

Una vez cumplido con dicho requisito una ejecución de fanout debe tener la siguiente estructura:

>./fanout «MACHINES» «commands and parameters to run on each machine»

Donde cada maquina incluida en el primer parámetro del comando se encuentra separada por un espacio.

Un sencillo ejemplo podría ser:

>./fanout «192.168.1.34 192.168.1.35» «id»

Starting 192.168.1.34

Starting 192.168.1.35

Fanout executing «id»

Start time mié ago 17 01:18:51 CEST 2011 , End time mié ago 17 01:18:55 CEST 2011

==== On 192.168.1.34 ====

uid=0(root) gid=0(root) grupos=0(root)

==== On 192.168.1.35 ====

uid=0(root) gid=0(root) groups=0(root)

Exiting fanout, cleaning up…done.

Como puede apreciarse, el comando “id” se ha ejecutado de forma paralela en las maquinas indicadas, limpio y simple, sin embargo cabe anotar que se ha utilizado un comando no interactivo, es decir que su ejecución y posterior resultado no depende de la interacción directa con el usuario, este tipo de comandos son frecuentemente relacionados con consultas que se realizan sobre el sistema o acciones que reciben determinados parámetros y no necesitan absolutamente nada mas por parte del usuario, sin embargo, existen otros comandos que si que requieren de la interacción del usuario para ejecutarse y retornar algún tipo de resultado (como por ejemplo el uso de editores de texto), por este motivo existe “fanterm”, sin embargo antes de explicar el uso de dicha herramienta, se exponen algunos otros ejemplos de fanout para que el lector pueda apreciar lo fácil que es su uso y la vez lo potente que es.

>./fanout «192.168.1.34 192.168.1.38» «whoami»

Starting 192.168.1.34

Starting 192.168.1.38

Fanout executing «whoami»

Start time mié ago 17 01:36:17 CEST 2011 , End time mié ago 17 01:36:22 CEST 2011

==== On 192.168.1.34 ====

root

==== On 192.168.1.38 ====

root

Exiting fanout, cleaning up…done.

>./fanout «192.168.1.34 192.168.1.38» «uname -ar»

Starting 192.168.1.34

Starting 192.168.1.38

Fanout executing «uname -ar»

Start time mié ago 17 01:36:57 CEST 2011 , End time mié ago 17 01:37:02 CEST 2011

==== On 192.168.1.34 ====

Linux debian 2.6.32-5-amd64 #1 SMP Tue Jun 14 09:42:28 UTC 2011 x86_64 GNU/Linux

==== On 192.168.1.38 ====

Linux hacker-VirtualBox 2.6.35-30-generic #56-Ubuntu SMP Mon Jul 11 20:01:08 UTC 2011 x86_64 GNU/Linux

Exiting fanout, cleaning up…done.

>./fanout «192.168.1.34 192.168.1.35» «users»

Starting 192.168.1.34

Starting 192.168.1.35

Fanout executing «users»

Start time mié ago 17 01:38:29 CEST 2011 , End time mié ago 17 01:38:34 CEST 2011

==== On 192.168.1.34 ====

root

==== On 192.168.1.35 ====

hacker root

Exiting fanout, cleaning up…done.

Todos los comandos anteriores, como puede verse se han ejecutado y han retornado los resultados de vuelta a la consola de la maquina donde se ejecuta fanout. Por otro lado, la ejecución de “fanterm” es incluso más sencilla, dado que su funcionamiento también es sencillo, en primer lugar establece conexión con cada una de las maquinas indicadas en el comando fanterm (servidores SSH) y posteriormente intenta crear una sesión “xterm” esto quiere decir que se abrirán en la máquina donde se ejecuta el comando, tantas consolas como servidores SSH se haya indicado, de este forma se pueden ejecutar comandos de forma interactiva en cada uno de los servidores SSH, la estructura de este comando es muy simple:

>fanterm MACHINES

Cada una de las maquinas indicadas se debe encontrar separada por espacios, por ejemplo

>./fanterm 192.168.1.34 192.168.1.35

Con el comando anterior, simplemente se abrirán terminales para cada una de las maquinas indicadas, pudiendo ejecutar de esta forma comandos de forma manual en cada una de ellas