educación, informática y demás

24.13 - Repaso general

Ejercicios de Scripts

Ejercicio 1 – checkConnection.sh

Crea un script que reciba por parámetro la dirección IP de un equipo remoto. El script comprobará si hay conexión o no con el equipo remoto de una forma un tanto peculiar.

Mientras no haya conexión con el equipo remoto, el script esperará 5 segundos y volverá comprobar si hay conexión.

Cuando haya conexión con el equipo remoto, el script terminará su ejecución.

Después de cada comprobación, el script almacenará un mensaje de log en el fichero connection.log almacenado en el directorio /etc/educatica/network. Si el fichero existe, añadirá la información al final del mismo.

El mensaje de log estará compuesto por la fecha, la hora, la dirección IP y la cadena «Sin conexión» o «Conectado» dependiendo de si hay o no conexión. Los campos estarán separados por el caracter «:»

  • La fecha y hora actual en formato «yymmdd:hhmmss»
  • Dirección IP proporcionada por parámetro.
  • Cadena Sin conexión o Conectado

Solución

El host destino lo vamos a recibir en un parámetro y lo almacenaremos en una variable cuyo nombre puede ser host.

Un bucle que se repetira mientras se cumpla una condición, por tanto tenemos un bucle while. La condición, que no haya conexión con el host.

Ahora lo que necesitamos es determinar que comando ejecutaríamos nosotros desde bash para comprobar que (no) haya conexión con el equipo host.

Para negar la condición tendríamos que utilizar un ! delante del comando.

El comando ping mostrará información en pantalla, tanto en salida estándar como en salida de errores si se produce un error, por tanto estaría bien redirigir ambas salidas a /dev/null.

Todavía nos queda esperar cinco segundos…

Usaremos el comando sleep.

Así pues, sleep 5 será el comando a ejecutar dentro del bucle.

El bucle terminará cuando haya conexión con el equipo remoto.

Después de cada comprobación, es decir después de ejecutar ping para comprobar si hay o no conexión. La ruta del fichero de log es /etc/educatica/network/connection.log. Deberíamos comprobar que el directorio exista y si no, crearlo.

Esto lo hacemos fuera del bucle, puesto que solo vamos a hacerlo una vez en la ejecución del script.

  • La fecha y hora actual en formato «yymmdd:hhmmss»
  • Dirección IP proporcionada por parámetro.
  • Cadena Sin conexión o Conectado

Como tendremos que almacenar varios mensajes de log que tienen que obtener información de fecha y hora y tienen un formato concreto, sería buena idea reutilizar y simplificar su uso creando una función, por ejemplo function log ().

Lo primeroq ue tenemos que conseguir es obtener la fecha y hora en el formato solicitado. Consultamos la página de manual del comando date y probamos en la consola de comandos o bash hasta que tengamos los resultados deseados.

Ahora podemos utilizar ese comando en nuestro script.

Mostramos la fecha y hora, la dirección del host remoto y un mensaje que se pasa en el primer parámetro de la función. Ojo! Todo esto lo tenemos que almacenar en un fichero, añadiéndolo al final del mismo si existe, no mostrándolo en pantalla.

Ahora ya lo tenemos bastante más avanzado. Nos quedaría utilizar la función en nuestro script.

De esta forma, se ejecutará la función log cuando el comando ping de error, con el mensaje Sin conexión y cuando termine el bucle porque ya no se cumple la condición, es decir hay conexión con el host. En este último caso, el mensaje será Conectado.

Con todo esto el script quedaría así:

Vamos a probarlo…

Nos damos cuenta de que no estamos controlando si se pasan o no parámetros.

Si no se pasa parámetro, comprobaremos la conexión con localhost, que siempre funcionará 🙂

Vamos a comprobar qué sucede si no tiene conexión con nadie…

Nos damos cuenta de que, quizá, estaría bien que se mostrara alguna información para que el operador sepa que está pasando.

la opción -n en el comando echo hace que no salte de línea después de mostrar el mensaje en pantalla. De esta forma, los puntos aparecerán en la misma línea creando una lista de puntos

Dejar una respuesta