educación, informática y demás

GNU/Linux bash

Obteniendo el valor de salida de un comando

Vamos a practicar con la herramienta de bash que nos permite obtener la salida de un comando dentro de nuestro shell script.

Como sabemos el formato de esta herramienta es el siguiente: $(CMD).

fechaHora.sh

Crea un script que almacene en variables datos de fecha y hora del sistema.

Debemos almacenar en variables la siguiente información: dia, mes, año, hora, minutos y segundos.

Al final mostrará esta información en pantalla.

Solución

Lo primero que tenemos que conseguir es mostrar cada una de las informaciones que nos piden por pantalla. ¿Sabemos hacer esto?. Sabemos que el comando que nos permitirá mostrar esta información es date, así que vamos a consultar la ayuda.

Ya sabemos que opciones de formato tenemos que utilizar para mostrar cada uno de los datos de fecha y hora independientes que nos han solicitado.

Ahora, tenemos que utilizar el comando date con el formato adecuado y almacenar esa información en cada una de las variables solicitadas que tendrán que tener nombres significativos. Podemos utilizar nombres basados en inglés para evitar el carácter ñ en el nombre de variables.

Sabemos que si somos capaces de mostrar un dato en pantalla podemos utilizarlo en nuestro script como si fuera una variable con $(CMD). Lo que vamos a hacer es almacenar esta información en variables para utilizarla posteriormente.

Esta sería la salida del script

El final se lo hemos añadido por darle un toque más cercano O:).

En esta ocasión vamos a lanzar el editor de texto en un proceso nuevo o en segundo plano utilizando & al final de la línea del comando a ejecutar. Con esto, indicamos al interprete de comandos bash que queremos que ejecute el programa mousepad en un proceso nuevo, no en el proceso que ejecuta la shell. Esto nos permitirá poder seguir utilizando la shell o terminal.

Ejecución de mousepad en segundo plano, en un proceso nuevo distinto del proceso que ejecuta la terminal

El código fuente sería el siguiente.

userLog.sh

Nos gustaría mantener un registro con información de los usuarios del sistema a lo largo del tiempo. Para ello, nos gustaría contar con un directorio llamado usuarios en el directorio raíz que contendrá toda una jerarquía de directorios organizados por año, mes y día dónde se almacenarán ficheros de texto plano con información sobre usuarios.

De esta forma, tendremos un directorio por año, por ejemplo /usuarios/2023. Dónde tendremos un directorio por mes, por ejemplo /usuarios/2023/enero. Dentro de este directorio de mes, tendremos un directorio por día, por ejemplo /usuarios/2023/enero/26_jueves. Dentro de ese directorio se crearán ficheros con la hora y minuto en el que se elaboró el informe de usuarios del sistema. Por ejemplo: /usuarios/2023/enero/26_jueves/informe-1318.log

Bien, cada vez que se ejecute el script, deberá crear el directorio dónde se almacenará el informe. Para ello obtendrá toda la información pertinente del comando date. Una vez creado el directorio, el script almacenará, añadiendo al final, en el fichero de informe la siguiente información:

  1. El contenido del directorio que almacena por defecto los directorios personales de los usuarios del sistema con información extendida de permiso, propietario y grupo.
  2. El contenido del directorio que almacena por defecto los directorios personales de los usuarios del sistema con información extendida de permiso, propietario y grupo y de todos sus subdirectorios (opción -R).
  3. Resumen de ocupación del directorio que almacena por defecto los directorios personales de los usuarios del sistema

Solución

Miramos la ayuda de date.

Vamos a probar a obtener la ruta del directorio y del fichero dónde guardaremos el informe antes de seguir con el script.

Ahora que tenemos claro que las rutas son correctas, tenemos que crear el directorio con mkdir con la opción -p y, gracias a las redirecciones de salida, almacenar la información que nos piden en el fichero de log.

El script hay que ejecutarlo como administrador para poder realizar las acciones.

userSnapShot.sh

Queremos hacer un script como el anterior, pero que nos muestre información solo del usuario que se pasa por parámetro. De esta forma, el script recibirá el nombre del usuario por parámetro y almacenará en un fichero de log un informe con datos sobre el usuario y su directorio personal.

El fichero de log sobre este usuario estará dentro del directorio /usuarios, dentro del directorio del año en curso y mes en curso, con el nombre del usuario y extensión .log.

La información se añadirá al final del fichero, sin sobrescribir la ya existente para dicho usuario. Se almacenará la siguiente información:

  • Día actual, con el nombre del día, seguido de la fecha completa.
  • Hora actual en formato: Hora:Minutos:Segundos
  • Nombre del usuario para el que mostraremos la información.
  • Información de identificación del usuario, mostrando UID y grupos a los que pertenece. Usamos un comando concreto para ello.
  • Información de permisos, propietario y grupo del directorio personal del usuario, no de su contenido. Asumimos que el directorio personal del usuario tendrá el nombre del usuario y estará dentro de /home.
  • Resumen de ocupación de su directorio personal en formato comprensible por humanos.
  • Etiqueta: Ficheros de video
  • Información extendida de todos los ficheros con extensión mp4 que haya en el directorio personal del usuario y todos sus subdirectorios
  • Etiqueta: Ficheros de texto
  • Información extendida de todos los ficheros con extensión txt que haya en el directorio personal del usuario y todos sus subdirectorios
  • Etiqueta: Shell Scripts
  • Información extendida de todos los ficheros con extensión sh que haya en el directorio personal del usuario y todos sus subdirectorios

Solución propuesta

Dejar una respuesta