Bash script para hacer una copia de seguridad de los archivos

0

Soy nuevo en bash, así que estoy un poco perdido con este script que hice para hacer una copia de seguridad de algunos directorios de la máquina local en un NAS. El NAS solo contendrá una cierta cantidad de archivos respaldados, así que antes de copiar uno nuevo, elimino el más antiguo de los existentes.

En primer lugar, la secuencia de comandos define todas las rutas, directorios y nombres de 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'

Luego usando la variable la nombra: Crea un archivo comprimido tar desde el directorio original. El archivo tar se guarda en un directorio temporal separado.

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

Elimina los archivos tar más antiguos 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

Borra el archivo tar del directorio temporal:

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

La secuencia de comandos se ejecuta sin ser atendida por un usuario que ha sido debidamente autorizado a través de cambios en el archivo sudoers. Todo funciona 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 lugar de la variable $OLDTAR , ya que no se resuelve, por lo que realmente se ejecuta:

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

Sin embargo, si ejecuto los comandos en el terminal uno por uno, lo hago funcionar bien. Puede ser un problema de permisos de usuario?

    
pregunta naio 10.10.2016 - 18:33

2 respuestas

1

Descubrí lo que estaba sucediendo: el usuario que ejecutaba el script no tenía suficientes permisos 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.

    
respondido por el naio 13.10.2016 - 10:11
2

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

  1. Configure los permisos / ACL para que no necesite sudo si es posible.
  2. Simplemente configure una secuencia de comandos para guardar los archivos localmente, y marque la fecha en la copia de seguridad
  3. Configure una secuencia de comandos para sincronizar el directorio de copia de seguridad desde el servidor local al NAS. Puede usar la opción --delete o --delete-after si desea que caduquen las copias de seguridad antiguas con el tiempo.
  4. Configure un script para purgar las copias de seguridad con fecha en la carpeta de copia de seguridad local

También, si no puede evitar usar root / sudo, agregue esta línea tmutil snapshot antes de cualquier eliminación y verifique una vez para permitir las copias de seguridad locales tmutil enablelocal en general, de modo que tenga una copia de seguridad si una secuencia de comandos elimina demasiado . Time Machine le permitirá recuperarse rápidamente de cualquier error en la lógica de los scripts.

Por último, para la depuración de bash: ejecute bash -x script o configure la depuración set -x para ver los valores de las variables y ver si tiene un error de ruta / error de codificación o alguna otra cosa que no esté bien.

    
respondido por el bmike 10.10.2016 - 22:00

Lea otras preguntas en las etiquetas