18 oct 2013

Bash Scripting: Remember ICMP Practices (Bash Boys!)

Hoy hablamos de los recuerdos de hace unos años donde nos pedían ejercicios, que por entonces nos parecían complejos y que a día de hoy nos parecen bastante normalitos. Nuestra etapa universitaria, donde te enseñaban cosas que te gustaban, y otras que no tanto, donde aprendías a relacionarte entre césped y césped,  y por supuesto entre mujeres que iban y venían... Hoy queremos recordar aquellos años con un ejercicio para fanáticos del scripting, los Bash Boys de la terminal.

Problema tipo:

Para un administrador de redes es importante contar con una serie de herramientas que le automaticen la gestión de la red. El alumno debe implementar un script llamado que:

  1. Reciba una lista de direcciones IP o nombres de máquina. Puede recibir la lista de la siguiente forma:
    1. a)  Por medio de argumentos, precedidos por el token ”hosts”
                       $ ./connect.sh hosts maquina1 [maquina2 ... ...]
    2. b)  Por medio de un fichero, indicándolo por el token ”file” $ ./connect.sh file fichero_hosts. El contenido de fichero hosts es una máquina por línea.
                       maquina1                 maquina2                 ....
    3. c)  Si no se usa ni ”hosts”, ni ”file”, se debe leer por la entrada estándar (mostrando el prompt ”>”), hasta fin de fichero.
  2. Por cada máquina, el script debe indicar si está activa o no (más concretamente si contesta a ping o no). Ninguna otra información debe aparecer en la pantalla.
  3. En caso de usar la opci ́on ”file”, el script debe comprobar la existencia del fichero indicado y que tiene permisos de lectura sobre el mismo. 

Nuestra solución:

En primer lugar tendremos que pensar en el paso de parámetros de hosts y file. Para ello utilizamos un case en bash, y seleccionar el parámetro primero ($1) y ver si contiene una de esas dos palabras. En el caso de contener la palabra hosts, recorreremos con un bucle for y el uso de la variable $* todos los elementos que son pasados como parámetros al script, exceptuando el $1 que tendremos que compararle para no procesarle. Una vez se van procesando los elementos desde $2 hasta $N, se van realizando los pings, redireccionando su salida a /dev/null. De este modo evitamos que se muestre información por pantalla, algo que no necesitamos, simplemente controlar si los ping se están realizando o no, eso lo conseguimos con el if.

En el caso de file, simplemente tendremos que controlar que el fichero exista y tengamos permiso de lectura. Después iremos leyendo mediante el while el contenido del fichero, y por cada línea realizaremos lo mismo que antes con el ping, para comprobar si hay conectividad. A continuación mostramos un trozo de código:

Para el caso del prompt o que no se metan parámetros de entrada, lo que haremos es colocar un while hasta encontrar un EOF (fin de fichero). El código es algo bastante sencillo como se puede comprobar a continuación:

Ahora os mostramos unas capturas con las ejecuciones en los distintos casos. El primer caso es el de los hosts consecutivos en la ejecución del script:

En el segundo ejemplo de salida utilizamos el parámetro file para indicar que lo siguiente que introducimos es un archivo de texto, el cual es comprobado en su existencia y en sus permisos.

Por último, utilizamos la entrada estándar para recibir los parámetros, existiendo dos casos, el que lo escribe el usuario mediante un prompt y el que se lo pasamos mediante un pipe y la ejecución de cat sobre el fichero de texto.

Esperamos que este problema antiguo de Universidad de bash, y su solución os hayan parecido interesante. Esperamos proponer más problemas de este tipo o mayor entidad y proponer soluciones. Al final de un ingeniero lo que se espera son sus soluciones, y no los problemas que pueda dar.

6 comentarios:

  1. Muy bueno y bien explicado. ¡Así da gusto aprender!

    ResponderEliminar
  2. Buenas, hace un tiempo hice algo similar, lo he dejado por aquí:https://github.com/felmoltor/bulkicmp/blob/master/testicmp.shLas ventajas respecto a tu script es que mi salida sale de colorines bonitos y como parámetro acepta tanto un fichero como una IP única.Saludos.

    ResponderEliminar
  3. ☺ Felipower ☺: Buenas, hace un tiempo hice algo similar, lo he dejado por aquí:https://github.com/felmoltor/bulkicmp/blob/master/testicmp.shLas ventajas respecto a tu script es que mi salida sale de colorines bonitos y como parámetro acepta tanto un fichero como una IP única.Saludos.""""Ventajas"""" quería decir, claro, jejeje.

    ResponderEliminar
  4. Que bonito que es programar en Bash, podes hacer mucho con muy pocas líneas de código, muy entendible y rápido de implementar.

    ResponderEliminar
  5. He hecho una solución, pero con funciones, igualmente creo que es más practica la suyahttp://pastebin.com/Nq4B5snu

    ResponderEliminar
  6. Por apurado publiqué el código con bugs, aca el código buenohttp://pastebin.com/2j3qWN8K

    ResponderEliminar