educatica!

educación, informática y demás

Ejercicios, GNU/Linux bash, Informática, Shell scripts, Sistemas operativos

Bash Shell Scripts – Ejercicios resueltos 4

homeSizes.sh

Crea un script que proporcione información de ocupación de cada uno de los directorios que hay dentro del directorio /home.

Este script debe ser ejecutado por root. Si no es así, se debe mostrar un mensaje de error adecuado y terminar la ejecución del script con código de error.

Solución

El comando que deberíamos utilizar para obtener información de ocupación es du -sh: -s nos da información resumida y -h nos da información de ocupación en formato comprensible por humanos.

homeSizes.sh – version 02

Crea un script que proporcione información de cada uno de los directorios que hay dentro del directorio /home.

Este script debe ser ejecutado por root. Si no es así, se debe mostrar un mensaje de error adecuado y terminar la ejecución del script con código de error.

Se desea mostrar para cada directorio, el nombre del directorio, debajo la información de permisos, propietario y grupo del directorio, no de su contenido y, por último, la ocupación en disco del directorio.

Solución

Ya no podemos usar simplemente du -sh /home/* porque nos piden información para cada directorio.

Si expresamos en castellano lo que nos pide, para cada directorio debemos hacer algo, se puede ver que vamos a necesitar un bucle for que permitar recorrer cada directorio en una lista de directorios. Esta lista de directorios será el contenido del directorio /home.

Recorremos esta lista con un bucle for.

Ahora podemos comprobar, si queremos, que realmente estamos recorriendo la lista de directorios en /home antes de continuar.

Ahora implementamos las funciones que nos piden para cada directorio.

Ahora que sabemos que comandos utilizar, los usamos dentro del script con las variables adecuadas.

usuario.sh

Otra opción…

addUsersSQL.sh

Crea un script llamado addUsersSQL.sh que genere un script SQL que añada todos los usuarios del sistema a una tabla de una base de datos.

Se consideran usuarios del sistema a aquellos que ejecutan como shell el shell /bin/bash.

La tabla en la que insertaremos los datos será usuarios, de la base de datos system. Las columnas en las que insertaremos los datos serán name y home, y los valores que insertaremos será el nombre del usuario y la ruta de su directorio personal.

addNewPartner.sh

Crea un script llamado addNewPartner.sh que se encargará de añadir un nuevo empleado a la empresa. Este script recibirá tres parámetros obligatorios: el nombre del usuario, el nombre del grupo al que pertenece y el nombre del equipo en el que trabajará.

Este script debe ser ejecutado por root. Si no es así, se mostrará un mensaje de error adecuado y terminará la ejecución del script con código de error.

Debe recibir valores por parámetro para el nombre del usuario, el nombre del grupo y el nombre del equipo. Si no es así, se mostrará un mensaje de error adecuado y terminará la ejecución del script con código de error.

Si el usuario existe, se deberá mostrar un mensaje advirtiendo de que dicho usuario ya existe en la empresa, sino lo creamos.

Si el grupo no existe, lo creamos.

Ahora vamos a realizar las funciones del script:

  1. Añadimos el usuario al grupo.
  2. Creamos un directorio con el nombre del equipo del usuario dentro de su directorio personal
  3. Creamos un directorio con el nombre del usuario del directorio /educatica/empleados.
  4. Creamos un directorio con el nombre del usuario dentro del directorio /backup/2021
  5. Nos aseguramos que ambos directorios tienen como propietario al usuario y como grupo al grupo.
  6. Debemos establecer los permisos de ambos directorios de forma que, el propietario tenga todos los permisos, el grupo solo acceso para lectura y el resto nada.
  7. Creamos una copia de seguridad del contenido del directorio personal del usuario en /backup/2021

Solución

Primero vamos a realizar el control de errores.

Probamos que se controlan los errores

userOp.sh

Crea un script llamado userOp.sh que reciba una operación y un usuario por parámetro. Dependiendo de la operación recibida el script realizará una acción sobre la cuenta de usuario que se pasa.

Las operaciones válidas son:

  • a : Añade el usuario al sistema.
  • b : Borra el usuario del sistema.
  • c : Copia el directorio personal del usuario en /backup
  • g : Muestra los grupos del usuario en pantalla.

Si el usuario inserta cualquier otra opción se deberá mostrar un mensaje advirtiendo que la operación es desconocida.

Este script debe ser ejecutado por root.

La operación se recibirá en el primer parámetro y el nombre del usuario en el segundo. Ambos parámetros son obligatorios.

Solución

Solución 02

Podemos optar por otra solución que muestre la sintaxis del comando cada vez que se de un error, sin importar cual sea el error. Para ello, tan solo tendríamos que subir la función sintaxis encima de la de error para poder invocarla desde aquí y después quitar las llamadas a sintaxis donde se provoque un error.

El código quedaría como sigue:

usersHTML.sh

Crea un script llamado usersHTML.sh que genere un fichero html llamado users.html que contenga una página web con la información de usuarios en el sistema.

Para ello, generaremos todo el documento HTML e insertaremos una tabla que contendrá para cada usuario una fila con la información del usuario: nombre de usuario, UID, GID, HOME y SHELL.

Solución

Lo primero que deberíamos pensar es cómo generamos nosotros un fichero HTML desde un script. Tan sencillo como escribir en un fichero con redirecciones. Ahora lo que tenemos que hacer es escribir código HTML en lugar de mensajes.

¿Sabemos mostrar en pantalla una línea HTML como por ejemplo <html>?

Ahora solo tenemos que generar estos datos en el script. Utilizaremos variables para el nombre del fichero y el título del documento HTML, utilizaremos echo y redirecciones para generar cada línea del documento HTML.

Hay que destacar el uso del caracter \ de escape que se utiliza para insertar dentro de una cadena de texto un caracter especial, como son las comillas, que de no hacerlo, cerrarían la cadena de texto y provocarían un error de sintaxis.

Sin embargo nos falta la parte más importante del script, que sería la de generar la tabla con la información de usuarios. Para ello, lo único que tenemos que hacer es recorrer los usuarios del sistema – consideramos que serán aquellos que utilicen /bin/bash como interprete de comandos – y generar cada celda de la tabla.

Para cada registro obtengo la información del usuario y después tendremos que formatearla con HTML.

Podemos utilizar funciones para mejorar la legibilidad.

Esto es solo un ejemplo de lo que se puede llegar a hacer con scripts. Se podría mejorar el código pero, ahora mismo, se sale un poco de los objetivos de este documento, así que se deja como opción por si queréis enredar.

addListUsers.sh

Crea un script llamado addListUsers.sh que reciba por parámetro una lista de nombres de usuario.

El script recorrerá la lista de usuarios pasada por parámetro. Para cada usuario de la lista, comprobará si el usuario existe. Si existe, mostrará un mensaje advirtiendo de que el usuario ya existe en el sistema, si no existe creará una cuenta de usuario nueva.

Solución

Enla variable $@ se almacena la lista de parámetros que se pasa al script. Así que utilizamos esta variable como lista.

Según la ayuda del comando for, si no ponemos una lista a recorrer automáticamente utilizará $@, sin embargo he preferido ponerla con fines didácticos, para practicar con esta variable.

addListUsers.sh – Versión 2

Vamos a modificar un poco la funcionalidad del script. Si no se pasa ningún parámetro al script, se solicitará que el usuario inserte los nombres, uno a uno, de los usuarios que se desean crear.

De esta forma, si se pasan parámetros, se utilizarán los parámetros como una lista de usuarios funcionando como se había hecho hasta ahora.

Si no se pasa ningún parámetro, se leerá por teclado el nombre del nuevo usuario a crear. Si el usuario existe, se muestra un mensaje de advertencia y si no existe, se creará uno nuevo. Después se vuelve a pedir que el usuario inserte nombre de usuario por teclado. Mientras el usuario inserte algún valor por teclado se repetirá la operación.

Solución

Solución 02 – Mejorando con funciones

La primera función que nos puede mejorar mucho la legibilidad es una que se encargue de comprobar si el usuario existe y mostrar el mensaje si existe o crear el usuario en caso de que no exista.

Esta funcionalidad la usamos tanto en el bucle while como en el bucle for.

Le podemos pasar por parámetro el nombre del usuario.

Con este cambio, el script quedaría como sigue:

Solución 03 – Más funciones..

Podríamos crear una función para añadir usuarios de forma iterativa y otra para añadir usuarios por parametro.

El cuerpo del script quedaría así:

Deja un comentario

Tema creado por Anders Norén