educatica!

educación, informática y demás

Shell scripts

checkUser.sh

Vamos a crear un script similar, por no decir idéntico en cuanto a estructura, al script checkGroup.sh que hemos desarrollado en la entrada Bash shell script 03 pero en este caso trabajando con cuentas de usuario.

El script deberá recibir por parámetro el nombre de un usuario y comprobar si el usuario existe o no en el sistema. Si el usuario existe, mostrará información del usuario como su nombre, UID, GID, ruta del directorio personal y el shell que utiliza el usuario. Si no existe, informará por pantalla de que no existe y preguntará si se desea crear una cuenta de usuario en el sistema para dicho usuario. Si el operador responde con una «s» o una «S», se creará una nueva cuenta de usuario en el sistema para este usuario. En otro caso, no se creará.

El nombre del usuario es obligatorio, por tanto si no se pasa el nombre del usuario por parámetro, se debe mostrar un mensaje de error y terminar la ejecución del script.

Podemos partir del script checkGroup.sh guardado como checkUser.sh o escribirlo de cero.

Si optamos por modificar, debemos hacerlo con sumo cuidado poniendo especial atención en cada línea de código. Podemos aprovechar las herramientas de reemplazo de texto del editor.

Automáticamente, las primeras líneas podemos aprovecharlas

Seguimos analizando, ahora el if que comprueba si el grupo existe, que ahora deberá comprobar si existe el usuario. Para ello utilziaremos el comando id. Vamos a comprobar si nos siver para comprobar si un usuario existe o no en el sistema

Como se puede ver si no existe el usuario id devuelve un valor de retorno que no es cero, por tanto será erroneo y no se cumplirá la condición del if: nos sirve.

Seguimos redirigiendo la salida estándar y la de error al fichero /dev/null porque no nos interesa que se muestre nada en pantalla y no queremos

Ahora tenemos que mostrar los campos de la linea de configuración del usuario en el fichero de cuentas de usuario. Si no recordamos los campos podemos echar un ojo al fichero, a una línea o a la página de manual de passwd en la sección 5.

Ya tenemos el cuerpo del if, ahora nos vamos al cuerpo del else.

Hay que ejecutarlo como super usuario o root.

Versión 02 – El usuario debe ser root

Como sabemos, hay un comando en nuestro script que debe ser ejecutado como administrador. Por tanto, el script debe ser ejecutado como administrador, es algo obligatorio.

Vamos a modificar el script para que compruebe si el usuario que lo está ejecutando es root o no. Si el usuario no es root, entonces mostramos un mensaje de error y terminamos con la ejecución del script devolviendo un valor de retorno de error – exit 1, por ejemplo.

Necesitamos un comando que solo al ser ejecutado como root funcione correctamente, si lo ejecuta otro usuario devuelva un valor de retorno erroneo.

Por ejemplo, podemos aprovechar el primer comando.

Pero ese if no estaría bien, puesto que se cumplirá la condición si el usuario ejecuta correctamente el ls /root y root podrá hacerlo. Tenemos que negar la condición con !.

Si no eres root… mostramos mensaje de erro y salimos

Todavía hay que pulir algo más del script…

Vamos a emplear otra forma de comprobar si eres root mucho más elegante. El uid de root es cero, así que utilizando el comando id -u vamos a mostrar el uid de root y lo vamos a comparar con cero.

Como sabemos $(id -u) ejecutará el comando id -u y sustituirá toda la cadena por la salida de dicho comando. En este caso, la salida del comando será el UID del usuario, que es un número entero.

Ahora tenemos que comparar dicho número con el 0. Con esto, estamos comparando la salida del comando id -u con el número entero 0. Si no es igual a cero entonces no es root.

Vamos a echar un vistazo a la página de manual del man para comprobar como se comparan números enteros.

Versión 03 – Función error

Nos damos cuenta de que estamos repitiendo los mismos comandos en varias partes de nuestro script. Vamos a crearuna función de error, que muestre un mensaje de error y termine la ejecución del script con un código de error.

Al final una función es como un mini script, por tanto podrá recibir valores por parámetro y utilizarlos exactamente igual que un script.

De esta forma, si se ejecuta la línea 15 se llama a la función error con el parámetro «El script se debe ejecutar por root». Bash ejecutará entonces la función error, pasando como $1 el parámetro que es una cadena de texto. El siguiente comando que se ejecutará será la línea 10 y después la línea 11, que termina con la ejecución del script.

Versión 04 – Limpiando el programa principal. Nueva función

En la rama del if hay muchos comandos cuya función es la de mostrar información de un usuario. Podríamos meter todos esos comandos en una función. Tiene sentido, porque todos esos comandos tienen como objetivo único mostrar información de un usuario. Vamos a crear una función llamada showUserInfo que se encargue de mostrar información del usuario almacenado en la variable usuario.

De esta forma, la función principal del script, después de declarar variables, funciones y controlar errores, quedaría así

Mucho más facil de entender. Si queremos más detalles sobre lo que se hace en showUserInfo, tan solo tenemos que consultar el código de la función.

Al final, el script lo tenemos estructurado en tres grandes bloques de código.

En el bloque de control de errores comprobamos que se cumplen los requisitos para que se pueda ejecutar el script. Nos aseguramos de que se puede ejecutar correctamente la función principal del script.

Por ejemplo, para este caso necesitamos que el usuario que ejecuta el script sea root y que, además, se pase el nombre de un usuario en el primer parámetro. Si no se cumple alguno de estos requisitos, mostramos un mensaje de error acorde y terminamos la ejecución del script.

Si llegamos a la línea 38 significa que se cumplen los requisitos para llevar a cabo la función principal del script y podemos ejecutar los comandos necesarios para ello.

Versión 05 – Mostrando información avanzada

Vamos a mostrar información más detallada del usuario. Aparte del nombre, uid, gid, home y shell, vamos a mostrar:

  1. El nombre del grupo principal al que pertenece el usuario.
  2. La lista de grupos de los que es miembro.
  3. Información de permisos propietario y grupo del directorio personal del usuario, no de su contenido.

Para poder consultar esta información necesitamos poder acceder a ciertos datos del usuario, como su GID o la ruta del directorio home. Sabemos consultarlos y mostrarlos de forma independiente en pantalla, es lo que hacemos en la función showUserInfo con comandos como este:

Sin embargo, ahora necesitaríamos pode acceder a ese dato, ese número, que es el GID del usuario para poderlo usar en un comando.

Vamos a comprobar cómo usuarios desde la terminal mostramos el nombre de un grupo dado su GID.

Como humanos interpretamos la salida de varios comandos, pero cómo hacemos para automatizar todo esto y que sea el script el que lo haga.

La solución está en utilizar la herramienta $(CMD) que ya conocemos. De esta forma, ejecutamos un comando que muestre en pantalla el GID del usuario en cuestión. Precisamente el comando que hemos mostrado en la línea 22.

Sin embargo, en lugar de mostrar ese valor por pantalla, lo que hacemos es usarlo dentro de nuestro script para asignarlo a una variable. Para ello usamos $(CMD).

De esta forma, nuestra función quedaría así:

Vamos a probar que todo está bien hasta aquí.

Ahora que tenemos los datos en variables podemos utilizarlos fácilmnente como parámetros de otros comandos. Con esta información podemos ampliar la información a mostrar de cada usuario.

  1. El nombre del grupo principal al que pertenece el usuario.
  2. La lista de grupos de los que es miembro el usuario
  3. Información de permisos propietario y grupo del directorio personal del usuario, no de su contenido.

Vamos a comenzar con el nombre del grupo principal.

Vamos a la consola y veamos cómo podemos obtener ese nombre.

Ahora utilizamos la variable $gid para obtener el gid del grupo principal del usuario.

Vamos a ver cómo mostraríamos los grupos de un usuario. Vamos a utilizar la consola para tratar de encontrar la solución.

Con esto estamos mostrando todos los grupos en los que aparece el nombre de usuario, tanto si es el nombre del grupo como si el usuario aparece en la lista de miembros.

Sin embargo, nos gustaría que no se mostrara el grupo cuyo nombre coincide con el del usuario. ¿C´´ómo podemos hacerlo?.

Vamos pensar como si empezaramos de cero. ¿Cómo podemos hacer para que se muestren todas las líneas de un fichero excepto las que comienzan por una cadena de texto concreta?.

Ahora que sabemos mostrar las líneas del fichero de grupos en las que aprece el usuario alfredoff, pero no que no son del grupo alfredoff, es decir es «miembro de», ahora cortamos y ordenamos.

El script quedaría así

El directorio home

Deja un comentario

Tema creado por Anders Norén