educación, informática y demás

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

Ejemplos de scripts completos

Crea un script llamado fileAdd.sh que recibirá por parámetro la ruta de un fichero. Este script añadirá el contenido del fichero a un fichero de registro dentro del directorio /castelar con el hombre history.log.

El script debe ser ejecutado como root, si no se debe mostrar un mensaje de error adecuado y terminar la ejecución con código de retorno de error.

El script debe recibir la ruta del fichero en el primer parámetro, si no se debe mostrar un mensaje de error adecuado y terminar la ejecución con código de retorno de error.

Si el fichero no existe, se debe mostrar un mensaje de error adecuado y terminar la ejecución con código de retorno de error.

Si el directorio /castelar no existe, lo creamos y lo configuramos para que el único usuario que pueda acceder para realizar operaciones de lectura y escritura sea el propiteario.

Añade al fichero history.log que está dentro del directorio /castelar la siguiente información en este orden:

  1. Fecha actual
  2. Hora actual
  3. Ruta del fichero a añadir
  4. Línea de separación
  5. Contenido del fichero
  6. Línea de separación.

Solución

Al final, la función del script es bastante simple, tan solo lleva cabo dos funciones:

  1. Si no existe el directorio /castelar lo crea y configura los permisos.
  2. Almacena una serie de información general y de un fichero cuya ruta se pasa por parámetro en un fichero de log: /castelar/history.log.

Estos comandos sabemos hacerlos sin problemas. Sin realizar comprobaciones ni utilizar «casi» variables quedaría así:

Sin embargo, a estas alturas tenemos claro que debemos usar variables para mejorar la legibilidad y el mantenimiento de nuestro script.

Esto sería solo la funcionalidad del script, sin realizar ningún control de errores de los que nos piden.

Lo primero que deberíamos haber hecho es, precisamente, el control de errores. Es decir, controlar situaciones que no se deben permitir, como nos dice el enunciado:

  1. Que el script no se ejecute por root.
  2. Que no se pase ningún parámetro
  3. Que la ruta proporcionada en el primer parámetro no sea la de ningún fichero.

Si se dan cualquiera de estas tres situaciones deberíamos mostrar un mensaje de error adecuado y salir del script con código de error. Como vamos a realizar esta acción varias veces, crearemos una función de error que nos facilite la tarea.

Comprobamos si el script se ejecuta por root, si no es así damos el mensaje de error y terminamos con la ayuda de la función error.

Si llegamos a la línea 26, sabemos que se ejecuta el script como root y que se ha pasado por parámetro una ruta válida de un fichero regular que existe. Ahora llevamos a cabo la función del script.

showSizes.sh

Crea un script que recorra todos los directorios del directorio actual. Para cada directorio del directorio actual mostrará el nombre del directorio y el resumen de lo que ocupa el directorio en disco en un formato comprensible por humanos.

Solución

Aquí nos están pidiendo que recorramos una lista de ficheros, en este caso los ficheros que están en el directorio actual. De esta lista de ficheros, debemos seleccionar solo los directorios. Otra opción es recorrer solo la lista de directorios, si somos capaces de obtenerla.

Vamos a recorrer la lista de ficheros del directorio actual y para cada fichero comprobamos si es un directorio. Si lo es, mostramos la información que nos piden, si no.. no la mostramos.

¿Cómo obtengo la lista de ficheros?. ¿Sabemos mostrar la lista de ficheros de un directorio en pantalla?. Lo haríamos con ls.

Ahora tenemos que utilizar esa lista en el script, para ello utilizamos $().

Podemos probar que funciona el recorrido de ficheros antes de continuar…

Con esto recorremos todos los ficheros del directorio actual, pero tenemos que trabajar solo con los directorios. Así que, tendremos que comprobar dentro del bucle que el fichero es un directorio.

Para ello, comprobamos para cada fichero del directorio si es un directorio. Si es un directorio, entonces mostramos el nombre del directorio y a continuación lo que ocupa.

Como du -sh ya muestra el nombre del directorio, podríamos obviar el echo de la línea 8.

showHomeSize.sh

Crea un script llamado showHomeSize.sh que recorrerá los directorios personales de los usuarios del sistema mostrando información de ocupación: para cada directorio se mostrará el resumen de lo que ocupa el directorio en un formato comprensible por humanos.

Este script deberá ser ejecutado por root, si no es así se deberá mostrar un mensaje de error apropiado y terminar la ejecución del script con un valor de retorno de error.

Para cada directorio personal de los usuarios, se deberá mostrar el nombre del usuario, la ruta del directorio personal y el resumen de ocupación del directorio personal.

Solución

Este script es similar al showSizes, aunque esta vez la lista de directorios a mostrar la tenemos que obtener del fichero de cuentas de usuario /etc/passwd.

Para cada usuario del sistema, es decir aquellos que utilizan /bin/bash, vamos a obtener la ruta de su directorio personal y mostraremos la información pertinente.

Vamos a ver como podemos obtener la lista de usuarios del sistema que ejecutan /bin/bash.

Ahora vamos a refinarlo para que solo nos muestre el nombre de los usuarios que ejecutan este shell.

Con esto conseguimos la lista de usuarios, además ordenada.

Así que podríamos recorrer la lista de usuarios y para cada usuario obtener la información que nos piden en el enunciado.

Con esto comprobamos que realmente estamos recorriendo los usuarios.

Para cada uno de estos usuarios debemos ser capaces de obtener la ruta de su directorio personal. Esta información está en su línea de configuración del directorio /etc/passwd.

Podríamos mejorar la visualización de datos, aprovechando la salida del comando du -sh. Además, podemos utilizar la salida de du -sh dentro de la misma línea.

Con esto tenemos implementada la funcionalidad. Sin embargo, nos faltaría lo primero que teníamos que haber hecho… comprobar que el script se ejecuta como root. Si no se ejecuta como root debemos mostrar un mensaje de error y terminar.

creaEntorno.sh

Crea un script llamado creaEntorno.sh que solicitará al usuario que inserte por teclado la ruta de un directorio dentro del que crearán una serie de directorios.

Se solicitará al usuario que inserte la ruta de un directorio. Si el usuario no inserta nada, se mostrará un mensaje de error adecuado y se terminará la ejecución del script con código de retorno de error.

Si la ruta del directorio no existe, se mostrará un mensaje de error adecuado y se terminará la ejecución del script con código de retorno de error.

Si el usuario no tiene permiso de escritura en el directorio, se mostrará un mensaje de error adecuado y se terminará la ejecución del script con código de retorno de error.

El script creará los directorios 2020, 2021 y 2022 dentro del directorio proporcionado. Además, dentro de cada uno de estos directorios, el script creará los directorios: redes, bbdd, ssoo, web y fol.

Por último, se cambiarán los permisos de estos tres directorios para asegurarse de que el resto de usuarios, los otros, no tengan ningún tipo de permiso de acceso.

Solución

addAllSh.sh

Haciendo uso del script fileAdd.sh creado anteriormente, crea un script llamado addAllSh.sh que añadirá al fichero de históricos todos los ficheros con extensión sh que estén en el directorio actual.

Suponemos que el script fileAdd.sh está en el directorio actual, aunque lo ideal es que estuviera en un directorio para ejecutables cuya ruta estuviera en la variable PATH.

Solución

Tenemos el script fileAdd.sh que recibe por parámetro la ruta de un fichero el cuál añade al fichero de historicos que está en /castelar. En este caso nos piden que añadamos a dicho fichero todos los ficheros con extensión sh.

Así que, lo que tendremos que hacer es recorrer todos los ficheros con extensión sh del directorio actual y añadir, uno a uno, al fichero de históricos.

Lo primero que vamos a tener que realizar es recorrer solo los ficheros con extensión sh. ¿Sabemos mostrar el listado de ficheros con extensión sh en el directorio actual? Si es así, entonces sabemos crear un bucle for que los recorra gracias a $(CMD).

Ahora creamos el bucle que los recorra y comprobamos que el bucle realmente recorre los ficheros – ya sabemos que esto lo hacemos solo para comprobar, con fines didácticos, pero no es necesario.

Ahora, lo único que tenemos que hacer es llamar al script fileAdd.sh pasándole como parámetro la ruta del fichero a añadir.

Eso si, para que funcione bien este script debería ser ejecutado como root.

Dejar una respuesta