0 votos

Bash script para hacer una copia de seguridad de los archivos

Soy nuevo en bash, así que estoy un poco perdido con este script que he hecho para hacer una copia de seguridad de algunos directorios de la máquina local en un NAS. El NAS sólo contendrá un número determinado de archivos respaldados, por lo que antes de copiar uno nuevo borro el más antiguo de los existentes.

En primer lugar el script define todas las rutas, nombres de directorios y archivos en variables

# Defines directories
ORIGEN='/Library/path-to-directories/'
DESTINAS='/Volumes/path-to-backup/'
DESTITAR='/Library/path-to-temp/'

# Defines names of the files and folders to delete (OLDDIR) and copy (NEWDIR)
OLDTAR=`/bin/ls /Volumes/path-to-backup/ | head -n 1`
NEWDIR=`/bin/ls /Library/path-to-directories/ | tail -n 1`

A continuación, utilizando los nombres de las variables: Crea un archivo comprimido en tar desde el directorio original. El archivo tar se guarda en un directorio separado y temporal.

/usr/bin/sudo /usr/bin/tar -czf "$DESTITAR$NEWDIR.tgz" "$ORIGEN$NEWDIR"

Elimina el más antiguo de los archivos tar del NAS:

/usr/bin/sudo /bin/rm $DESTINAS$OLDTAR

Copia el archivo tar en el NAS:

/usr/bin/sudo /bin/cp -Rp "$DESTITAR$NEWDIR.tgz" $DESTINAS

Elimina el archivo tar del directorio temporal:

/usr/bin/sudo /bin/rm -f "$DESTITAR$NEWDIR.tgz"

El script se ejecuta de forma desatendida por un usuario que ha sido debidamente autorizado mediante cambios en el archivo sudoers. Todo se ejecuta sin problemas excepto en este paso:

/usr/bin/sudo /bin/rm $DESTINAS$OLDTAR

El archivo de registro no muestra errores pero no hay nada en el lugar del $OLDTAR variable, como que no está resuelta, por lo que realmente se ejecuta:

/usr/bin/sudo /bin/rm /Volumes/path-to-backup/

Sin embargo si ejecuto los comandos en la terminal uno a uno consigo que funcione bien. ¿Puede ser un problema de permisos de usuario?

0 votos

Es un problema de permisos, el usuario que ejecuta el script puede escribir pero no leer en el directorio de destino. ¿Cómo es esto posible? los permisos en el OLDTAR directorio son: drwxrwxrwx 1 admin staff

0 votos

Si, en lugar de ejecutar el rm utilice echo $DESTINAS$OLDTAR ¿qué produce?

0 votos

@Allan: parece correcto, compone la ruta completa y el nombre del archivo.

3voto

Oskar Puntos 1242

Esta no es una respuesta real, pero yo dividiría tu pregunta en 4 tareas más pequeñas.

  1. Configurar los permisos / ACL para no necesitar sudo si es posible
  2. Sólo tienes que configurar un script para tarar los archivos localmente - y marcar la fecha de la copia de seguridad
  3. Configure un script para rsync el directorio de la copia de seguridad desde el servidor local al NAS. Puede utilizar el --delete opción o --delete-after si quieres que las copias de seguridad antiguas caduquen con el tiempo.
  4. Configurar un script para purgar las copias de seguridad con fecha en la carpeta local de copias de seguridad.

También - si no puedes evitar usar Root /sudo - añade esta línea tmutil snapshot antes de cualquier eliminación y comprobar una vez para permitir las copias de seguridad locales tmutil enablelocal en general para que tengas una copia de seguridad si un script</strkeep>scripts<strkeep>.

Por último - para depurar bash - ejecute bash -x script o establecer la depuración set -x para ver los valores de las variables y ver si tienes un error de ruta / codificación o algo más.

0 votos

Gracias @bmike esto es un remake completo del script que puedo considerar cuando tenga más conocimientos de bash. Sólo una pregunta: ¿por qué recomiendas rsync en lugar de copiar? ¿es sólo para la función de eliminación de copias caducadas o para algo más?

0 votos

@naio Me gusta que rsync tenga una opción --dry-run para decirme qué se copiará o borrará sin hacer el trabajo. Maneja archivos grandes - si la copia falla o se interrumpe, recoge a mitad de camino con un archivo. Es rápido, corrige errores y es realmente útil. Puedes usarlo como cp si se quiere fácil - pero es bastante poderoso en formas cp no lo es.

2voto

Blaszard Puntos 148

He encontrado lo que ocurría: el usuario que ejecutaba el script no tenía permisos suficientes para leer en el directorio NAS, por lo que el resultado de esto:

OLDTAR=$(/bin/ls /Volumes/path-to-backup/ | head -n 1)

era una cadena vacía, aquí es donde el script falló. En cambio si lo hago:

OLDTAR=$(/usr/bin/sudo /bin/ls /Volumes/path-to-backup/ | head -n 1)

funciona como esperaba.

AppleAyuda.com

AppleAyuda es una comunidad de usuarios de los productos de Apple en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X