educación, informática y demás

2305 - Scripts

Shell script backup.sh

Vamos a ir solucionando el script backup.sh que aparece en la entrada Resumen de Bash Shell Script, en el apartado Script backup.sh.

Enunciado

Con las bases del script con el que hemos estado practicando vamos a crear un script llamado backup.sh que recibirá por parámetro el nombre de un usuario del sistema.

El script realizará una copia de seguridad del directorio personal del usuario pasado por parámetro en el directorio /backups utilizando la herramienta tar.

El nombre del fichero de copia de seguridad será nombreUsuario.tar.gz dónde nombreUsuario es el nombre del usuario pasado por parámetro. Cuando utilicemos la herramienta tar lo que vamos a hacer es copiar todo el contenido del directorio personal del usuario pero si el fichero tar.gz ya existe y tiene contenido, vamos a añadir tan solo los ficheros nuevos o modificados*

man tar

El script deberá comprobar:

  • Si se ha pasado parámetro
  • Si existe la cuenta de ese usuario en el sistema
  • Obtener la ruta del directorio personal del usuario del fichero de cuentas de usuario del sistema
  • Si existe el directorio /backup o no.
  • Si se ha llevado a cabo la copia de seguridad correctamente sin errores

Primeros pasos

Variables, función error y comprobar parámetro

Vamos leyendo el enunciado y nos detectamos una serie de variables que vamos a utilizar en el script. La primera es la que nombrará al primer parámetro recibido. El resto son variables que almacenan valores, casi literales.

Seguimos con las restricciones que nos dan en el enunciado, la primera es la de que nos pasen parámetro. Así que comprobamos si el valor de la variable usuario está vacío.

Podemos cambiar el comando test por dos corchetes, dejando la expresión que queramos que se pase por parámetro comando test entre corchetes de apertura y cierre.

Cuidado con los espacios después y antes de los corchetes

Todavía podemos mejorar esta parte del código. Nos damos cuenta, leyendo las restricciones que vamos a tener que realizar varias comprobaciones que tengan que terminar con la ejecución del script con error. Así que vamos a crear una función de error que nos facilite este proceso.

Vamos a comprobar que funciona como esperamos

Comprobando si existe el usuario

No podemos hacer una copia de seguridad del directorio personal de un usuario que no existe en el sistema.

Así que, si no existe el usuario en el sistema, mostramos mensaje de error y salimos con código de error.

Esto funciona correctamente, pero hay un problema. El comando id mostrará información en pantalla que puede despistar al usuario o ser molesta. Vamos a redireccionar tanto la salida estándar como la de errores. Como no queremos para nada almacenar la salida de este comando en un fichero, vamos a mandar ambas salidas al fichero /dev/null a modo de agujero negro.

Si nos fijamos en la línea 20 utilizamos corchetes y en la línea 24 no. ¿Por qué? Por que en la línea 20 estamos ejecutando el comando test. Hemos rodeado la expresión -z $usuario entre corchetes para indicar a bash que debe ejecutar esa expresión con el comando test.

En realidad la línea 20 podríamos haberla escrito de esta forma, pero es menos legible para un programador.

En el segundo if, en la línea 24, no se utilizan los corchetes porque el comando que se está ejecutando es id no test.

Vamos a probar que todo va bien

Obtener los datos del fichero de cuentas de usuario

Sabemos que los datos de las cuentas de usuario del sistema están en /etc/passwd. Conocemos el formato de este fichero y sabemos que en cada línea se almacena información de una sola cuenta de usuario, que el primer campo es el nombre del usuario al que pertenecen los datos, que el separador de campos es «:» y que el campo que almacena la ruta del directorio personal del usuario es el 6.

Con comandos somos capaces de mostrar la ruta del directorio personal del usuario.

Ahora nos queda utilizar esta información dentro de nuestro script para almacenar esta ruta en una variable.

Utilizamos $() para ejecutar el comando que va entre paréntesis y que bash sustituya la salida del comando por toda la cadena.

La variable homeDir que hemos declarado inicialmente nos sobra, porque ahora cogemos la ruta del fichero de cuentas de usuario.

Vamos a ver si esto funciona, para ello añadimos un echo.

Ejecutamos el script

Directorio /backup

Si no existe el directorio /backup deberíamos crearlo. El problema con el que nos vamos a encontrar es que este script habría que ejecutarlo como root, aunque no nos lo han dicho en las restricciones es algo que nosotros deberíamos saber.

Si no somos root a la hora de ejecutar este script, posiblemente no podamos crear copias de seguridad de los usuarios del sistema puesto que, lo más probable, es que no tengamos permiso de acceso a sus ficheros y directorios

Primero, vamos a comprobar que si no existe el directorio lo podamos crear.

Ahora vamos a añadir una nueva comprobación de que el script se ha ejecutado como root. Para ello vamos a utilizar el comando id con la opción -u para obtener el UID del usuario que está ejecutando este script y compararlo con 0 que es el UID del usuario root.

Si el UID del usuario actual no es 0 significa que no es root y no continuamos ejecutando el script.

Con esto, el script quedaría así.

Vamos a probarlo

Normal, porque lo hemos ejecutado como usuario normal.

Vamos a pasarnos a root y lo ejecutamos…

El fichero no existe en el directorio actual, puesto que estamos en el directorio personal del usuario root. Tendremos que poner una ruta absoluta o cambiar de directorio al directorio personal del usuario alumno.

Comprobamos si se ha creado el directorio

Creando el backup con tar

Vamos a ver como funciona tar. Para ello usamos la ayuda del comando, su página de manual y trabajamos con el desde terminal.

Vamos a comprimir en un archivo

Descomprimir

Añadir solo los ficheros nuevos o cambiados

Vamos a añadir un nuevo fichero

O comprimimos con tar o actualizamos, las dos cosas no se pueden hacer.

Ahora mismo, para continuar con el ejemplo, tenemos que decidir entre comprimir o mantener solo los ficheros actualizados.

Elegimos añadir solo los ficheros nuevos

Así que utilizaremos la opción -u. Si queremos podemos mantener la extensión gz o no.

Con la opción u añade solo los ficheros nuevos o modificados al fichero tar.

Vamos a modificar un fichero, por ejemplo saludo.txt

¡No borra el fichero antiguo! Tenemos una copia de ambos ficheros.

Si no le indicamos nada, extrae la última versión. ¿Podemos extraer la anterior? Hay que mirarlo en la ayuda, pero esto lo dejamos para una versión posterior.

Ahora vamos al script, que quedaría así. Primero modificaría el nombre del fichero, porque no está comprimido, así que le quitamos la extensión gz.

Ahora añadimos la ejecución de tar.

El script quedaría más o menos así

Este script lo vamos a utilizar desde otros scripts. Por ahora, lo vamos a dejar como está, aunque en un futuro puede que tengamos que modificarlo.

Dejar una respuesta