educación, informática y demás

24.13 - Repaso general

Administración de sistemas

«Comprueba si existe el usuario pepe»

Podemos utilizar el comando id
Como operador informático vemos que si muestra información, el usuario tiene cuenta en el sistema. Si no muestra nada, no tiene cuenta

«si no existe, crea una cuenta de usuario con contraseña ClaveRoot#20»

Como el usuario existe, no hacemos nada.

«Comprueba si existe el usuario pepa, si no existe, crea una cuenta de usuario con contraseña ClaveRoot#20»

«Comprueba si existe el usuario mariamg, si no existe, crea una cuenta de usuario con contraseña ClaveRoot#20»

«Comprueba si existe el usuario marlengc, si no existe, crea una cuenta de usuario con contraseña ClaveRoot#20»

Este proceso lo vamos a repetir muchas veces, así que lo podemos automatizar.

Crea un script llamado usuarios.sh que reciba por parámetro el nombre de un usuario. Si el usuario no existe, crea una cuenta de usuario para ese usuario estableciendo como contraseña «ClaveRoot#20»

Vamos a hacer el esquema de siempre: Variables, funciones básicas, Control de errores y cuerpo del script.

Si no hicieramos control de errores en tiempo de ejecución, sobrarían las líneas de la 6 a la 19. Es más, si no utilizamos variables con nombres significativos, sobraría la línea 5 y trabajaríamos con $1 directamente. No obstante, queremos scripts, programas, que sean fiables, fáciles de entender y mantener, este es el motivo por el que utilizamos estas técnicas de programación estructurada.

«Comprueba si existe el usuario $usuario, si no existe, crea una cuenta de usuario con contraseña ClaveRoot#20»

Este es el script que nos queda con comentarios y técnicas de programación estructurada. Vamos a quitar los comentarios superfluos.

Aunque eran comentarios que no son necesarios, si que ayuda conocer un poco de forma muy resumida que hace cada bloque

Sin control de errores

Sin técnicas de programación estructurada.

Código sin control de errores, ni uso de variables o comentarios de identificación

Son solo cuatro líneas de código, pero ya tengo que pensar qué se tiene que pasar por parámetro analizando los comandos. Todo funcionara bien, siempre y cuando se cumplan los requisitos del script:

  • Que se pase el nombre de un usuario por parámetro
  • Que se ejecute con permisos de root

Si ejecutamos el script con errores, en este caso concreto, nos encontramos con una situación no esperada. Tenemos que analizar el código para entender por qué no funciona. Y esto es un caso muy simple.

¿Qué código es más comprensible?

Pero es que, además, si utilizamos control de errores no tenemos ni que analizar el código.

Hemos aumentado la cantidad de líneas de código, pero es más sencillo de utilizar, mantener y entender.

Vaya… había metido la pata con las comillas en el echo de la línea 21. Ya está corregido 😀

Modificación 01

Cada vez que se cree un nuevo usuario porque no existe, me gustaría tener constancia de ello en un fichero de log llamado usuarios.log que estará almacenado en /etc/educatica.

En este fichero de log, /etc/educatica/usuarios.log, tendremos información de todos los usuarios que hayamos creado con este script. Para ello, cada vez que creemos un nuevo usuario añadiremos una nueva línea al fichero.

La línea estará compuesta por:

  1. Fecha. Formato yymmdd
  2. Hora. Formato HH:MM:SS
  3. Operación: cadena de texto «crear»
  4. Nombre de usuario

Los campos estarán separados por «;»

Ejemplo:

250529;13:08:45;crear;mariojp

Ayuda

  • Para la fecha y hora te recomiendo el comando date
  • Comprueba si existe el directorio /etc/educatica y si no existe, créalo
  • Al utilizar cualquier tipo de redirección, si el fichero destino no existe se creará siempre.

Solución propuesta

Modificación 02

También queremos que, si el usuario no existe, se cree una entrada en el fichero de log con la única diferencia en que la operación será comprobar.

Es decir, si el usuario existe en el sistema, también se almacenará una nueva línea en el fichero de log usuarios.log con el mismo formato que hemos utilizado para la operación crear, salvo que, ahora, aparecerá la cadena de texto «comprobar» en lugar de «crear».

En el caso de que el usuario exista en el sistema, la línea estará compuesta por:

  1. Fecha. Formato yymmdd
  2. Hora. Formato HH:MM:SS
  3. Operación: cadena de texto «comprobar»
  4. Nombre de usuario

Los campos estarán separados por «;»

Ejemplo:

250529;13:08:45;comprobar;mariojp

Solución propuesta

El código es prácticamente idéntico. Funciona, si, pero si queremos modificar algo, tendríamos que duplicar el trabajo, cambiando en dos sitios distintos a la vez. Esto, aparte de duplicar trabajo, también puede llevarnos a errores humanos: que se nos olvide actualizar o cambiar alguno de los bloques.

Solución: el uso de una función. Esos comandos tienen una funcionalidad muy concreta, se pueden agrupar en una función que podemos reutilizar.

El código quedaría así:

Vamos a probarlo…

Modificación 03

Ahora queremos poder pasar una lista variable de parámetros con nombres de usuarios a crear o comprobar

Para cada usuario en la lista de parámetros realizaremos las acciones que hemos hecho hasta ahora.

Solución propuesta

El único cambio, además de quitar la asignación de $1 a la variable usuario en las primeras líneas del script, es la de añadir un bucle for que recorra todos los parámetros pasados al script.

El script sigue comprobando que se pase al menos un valor por parámetro. Esto podríamos quitarlo si queremos, puesto que el cuerpo del bucle no se ejecutará si no hay parámetros.

Modificación 04

Estamos pensado que estos datos, los nombres de los usuarios a comprobar y crear en caso necesario, nuestro jefe no los proporciona por correo electrónico, en una lista de nombres.

Hemos pensado que podríamos guardar esta lista de nombres en un fichero de texto plano y crear otro script llamado usuariosFichero.sh que recorra el fichero cuya ruta le proporcionemos por parámetro comprobando si el usuario existe y crearlo si no existe en el sistema.. es decir, hacer lo que hemos estado haciendo hasta ahora.

Como no queremos tener que repetir código ni modificar el que tenemos, que funciona y nos gusta, lo vamos a reutilizar. De esta forma, recorreremos el fichero llamado al script usuarios.sh pasándole como parámetro los nombres de usuario que haya en cada línea del fichero

Solución propuesta

Recorremos el fichero línea a línea

Si solo nos limitamos a la funcionalidad del script, el código sería el siguiente:

Con esto no tenemos control de errores, ¿Qué pasará si el fichero no existe o no me pasan ruta de fichero a recorrer? situación error inesperada en tiempo de ejecución.

Vamos a ver qué sucede 🙂

borraUsuarios.sh

Crea un script llamado borraUsuarios.sh que reciba por parámetro una lista variable de nombres de usuario del sistema cuya cuenta de usuario deberá eliminar.

Para cada nombre de usuario, se comprobará si la cuenta de usuario existe en el sistema. Si no existe, se mostrara un mensaje de advertencia y se almacenará en el fichero de log un log de tipo «comprobar».

Si la cuenta existe, la borramos manteniendo su directorio personal. Almacenaremos un mensaje de log en el fichero de log de tipo «eliminar»

Dejar una respuesta