educación, informática y demás

Ejercicios, Shell scripts

creaUsuarios.sh

Crea un script llamado creaUsuarios.sh que recibir´á por parámetro una lista de usuarios.

Este script tiene que ser ejecutado por el usuario root. Si no es así, se mostrará un mensaje de error adecuado y terminaremos la ejecución del script con código de salida de error.

Si no se pasa ningún parámetro, se mostrará un mensaje de error adecuado y terminaremos la ejecución del script con código de salida de error.

El script recorrerá la lista de usuarios pasada por parámetro y para cada usuario de la lista comprobaremos si existe o no en el sistema.

Si el usuario no existe en el sistema, crearemos una nueva cuenta de usuario para dicho usuario.

A continuación, mostraremos información de la cuenta del usuario en pantalla en el siguiente formato:

  • Nombre de usuario:
  • UID:
  • GID:
  • Home:

Ayuda: Cómo afrontar el script

Paso 1. Leer y entender

Lo primero que tenemos que hacer es leer y entender que nos piden, que debe hacer el script y qué restricciones tiene. Cuando hablamos de restricciones se hace referencia a qué condiciones se deben cumplir para poder ejecutarlo correctamente.

Al leer el enunciado sabemos que el script debe ser ejecutado por root y que necesita que se pasen nombres de usuario, al menos uno, por parámetro. Esas son las restricciones del script, las condiciones que se deben cumplir para que se pueda ejecutar la función del script de forma correcta. Esto sería el control de errores que tenemos que hacer: debe ejecutarse como root y necesita obtener parámetros.

Si no tienes claro como gestionar el control de errores, que no son más que comprobaciones con el comando if de condiciones como que se ha pasado un parámetro, que el usuario es root, que un fichero exista, etc… puedes consultar la publicación comprobación de parámetros y requisitos y si tienes dudas con el comando if, sentencia condicional, puedes consultar la entrada Estructuras de control. Comando if.

En cuanto a la funcionalidad del script, sabemos que tenemos que recorrer la lista de valores que nos pasan por parámetro y para cada uno de los valores pasados por parámetro, que se supone son nombres de usuario, realizar una función concreta. Esto nos indica el tipo de sentencia que tenemos que usar: un bucle for. Tenemos que repetir una serie de acciones para cada uno de los elementos de la lista, bucle. El bucle se repite para cada uno de los elementos de la lista, por tanto está claro que es un bucle for.

Ahora podemos centrarnos en qué tenemos que hacer con cada elemento de la lista, es decir, el cuerpo del bucle. Si el usuario no existe en el sistema lo creamos. A continuación mostramos información para esa cuenta de usuario.

  • ¿Sabemos comprobar si un usuario existe en el sistema?
  • ¿Sabemos crear un usuario?
  • ¿Sabemos consultar la información de un usuario concreto en el fichero de cuentas de usuario?

Si sabemos hacer esto, tenemos el script resuelto.

Paso 2. Estructura básica. Refinamientos progresivos.

Si no tenemos mucha soltura creando scripts, lo mejor sería ir solucionando poco a poco cada parte del script, comprobando que la parte del script que hemos creado funciona correctamente antes de pasar a la siguiente.

Como ya hemos visto a lo largo de todos los scripts creados, los scripts tienen tres o cuatro secciones bien diferenciadas.

  1. Funciones
  2. Obtención de datos.
  3. Control de errores
  4. Funcionalidad básica del script.

Parte 1. Funciones

Las funciones nos permiten reutilizar código y también nos facilita poder centrarnos en ciertas partes del problema de forma aislada. Es decir, poder resolver una parte del problema dentro de una función y después ejecutar la función dentro del programa.

Ahora mismo, no vemos ninguna función evidente, salvo la función error que ya hemos utilizado en varios scripts y que nos puede venir bien para terminar con la ejecución del script cuando no se cumplan los requisitos: ser root y recibir algún parámetro.

Ahora llenamos de contenido la función error. Esta función recibirá por parámetro el mensaje de error a mostrar en pantalla.

El $@ dentro de la función hace referencia a los parámetros que se pasen a la función, no al script donde está escrita la función. Esto se conoce como el ámbito de la función.

Parte 2. Obtención de datos

Si queremos podemos usar una variable para almacenar la lista de parámetros, por darle un nombre un poco más significativo, aunque en este caso no es estrictamente necesario.

Parte 3. Control de errores

Si el usuario no es root…

Ahora deberíamos conocer qué comando ejecutar para comprobar si somos root o no. Podemos utilizar el comando id para consultar el UID efectivo del usuario actual. Si no recordamos cómo, podemos usar la terminal para practicar o consultar información.

Si el UID dle usuario (id -u) no es igual a 0 entonces no eres root.

Estamos ejecutando el comando test. Podríamos haberlo escrito así:

Hemos usado -ne porque queremos que se cumpla cuando no sea igual a 0 el valor de la salida del comando id -u.

La mejor manera de comprobar si una comprobación funciona es comprobarlo en la terminal antes. Por ejemplo la variable de entorno EUID o USER no nos valdrían.

Aquí podríamos realizar muchas comprobaciones distintas. Por ejemplo, podemos comprobar que el número de parámetros sea mayor que cero o que no sea igual a 0.

El script hasta ahora quedaría así:

Antes de continuar con la siguiente parte, lo probamos y solo pasamos a la siguiente parte si todo funciona OK.

Parte 4. Funcionalidad del script

Apartado 1. Que funcione el bucle

Como consejo, primero haría el bucle y comprobaría que el bucle funciona como se espera.

Cuando el bucle est´é bien hecho, entonces crearía la funcionalidad del script dentro del cuerpo del bucle.

Si no te acuerdas de como funciona un for, consulta la ayuda en una terminal con el comando help for.

Si el bucle funciona, tenemos una gran parte del script hecha, aunque realmente el script no haga nada todavía. No obstante, a nivel complejidad de programación, si tenemos muy avanzada la estructura del script.

El bucle funciona, ahora deberíamos implementar la funcionalidad del bucle. Para ello tenemos dos alternativas, escribir los comandos que realizarán la función del cuerpo del bucle directamente o bien usar funciones que agrupen los comandos por su objetivo, finalidad o funcionalidad.

Apartado 2. El cuerpo del bucle – Usando funciones

Vamos a usar funciones para dividir la funcionalidad del cuerpo del bucle. Si leemos el enunciado, nos piden que creemos la cuenta del usuario si no existe y que después mostremos la información del usuario.

Por tanto, tenemos claro que tenemos que hacer dos cosas distintas, una detrás de otra. Podríamos agrupar los comandos necesarios para comprobar si existe la cuenta del usuario y si no existe crearla en una función y los comandos para mostrar la información de un usuario en otra función. Los nombres deberían ser lo más significativos posibles, por ejemplo: creaUsuario y muestraInfoUsuario. El bucle quedaría así:

Inicialmente, solo para estructurar, no creamos los comandos del cuerpo de las funciones, tan solo creamos las funciones y las llamamos desde el bucle.

El bucle quedaría así:

Podemos probar en la terminal que esto funciona, es decir que se llama a cada una de las funciones aunque ahora mismo no hacen más que mostrar un mensaje.

Ahora tan solo tenemos que centrarnos en el cuerpo de cada una de las funciones para que realice la tarea que tiene que realizar.

Función creaUsuario

Si no existe el usuario, lo creamos.

Yo utilizaría el comando id para comprobar si el usuario existe. Si el comando id con el nombre del usuario como parámetro falla, entonces no existe el usuario y hay que crearlo.

Aquí la condición del comando if será la ejecución del comando id, negando puesto que queremos que se cree el usuario si este no existe.

Si no tienes claro porqué hemos usado el comando id te lo explico. ¿Cómo comprobarías como administrador si una cuenta de usuario existe en el sistema?. Una forma de hacerlo es con id.

Como humanos leemos la salida en pantalla del programa id. En el script, el comando if recibe el código de salida del comando ejecutado, si el comando devuelve un código de salida correcto entonces se cumple la condición.

Función muestraInfoUsuario

Primero podemos practicar desde la terminal que comando o comandos con tuberías deberíamos utilizar para obtener la información que nos piden mostrar.

Una vez tenemos claro cómo obtener esta información, ahora nos vamos al script y en la función concreta lo mostramos.

Vamos a probarlo.

OH! Un error! Resulta que en este entorno existe una variable llamada UID que es de solo lectura.

No pasa nada, le cambiamos el nombre a la variable de nuestro script. Por ejemplo, vamos a ponerla en minúscula.

Otro problema, resulta que el comando id muestra información en pantalla que no queremos que aparezca. Redirigimos la salida estándar y la de error al fichero /dev/null.

Vamos a probarlo ahora.

El script entero quedaría así

Apartado 2. El cuerpo del bucle sin funciones

Dejar una respuesta