miércoles, 15 de julio de 2026

Automatiza tus copias de seguridad ( Linux con Bash y rsync )


Ilustración sobre cómo automatizar copias de seguridad en Linux con Bash, rsync y Cron mediante un script y tareas programadas.


La terminal de Linux impone respeto pero una vez que dominas sus comandos básicos, te das cuenta de que la consola de Linux no es tu enemiga sino tu aliada para automatizar tareas.

Hoy vamos a abordar uno de los mayores dolores de cabeza de cualquiera que trastee con servidores, administre una Raspberry Pi en casa o que  trabaje en entornos de desarrollo Linux, las dichosas copias de seguridad!!

Hacer backups manuales copiando y pegando carpetas da una pereza tremenda y siempre lo dejamos para otro momento o se nos olvida, así que hoy vamos a programar un script super sencillo en Bash de forma eficiente utilizando la herramienta reina del mundo sysadmin, rsync

Después, configuraremos un cronjob para que el sistema lo ejecute por nosotros a diario. 

¡Al lío!


La regla 3-2-1 de los Backups

En ciberseguridad y sistemas hay una norma sagrada que deberías seguir si no quieres perder tus datos ante un ataque de ransomware o un fallo físico de hardware.

  • 3 copias de seguridad de tus archivos importantes.
  • Al menos en 2 soportes físicos diferentes (SSD principal, un disco externo o un NAS).
  • Al menos 1 copia fuera de tu casa (nube o en un servidor remoto).
Muchos novatos caemos al principio en el error de crear scripts de backup usando el mítico cp (copy) o empaquetando todo con tar cada día... El problema de esto es que cuando nuestros archivos crecen, copiar Gb de datos consume muchísimos recursos, tiempo y vida útil de los discos.
Es aquí donde entra rsync (Remote Sync), una herramienta que en lugar de copiar todo desde cero, compara el origen con el destino y solo transfiere los cambios, archivos nuevos, modificados o eliminados! Esto hace que tu backup tarde segundos en lugar de minutos.


El Script en Bash 

Vamos a crear un script sencillito  documentando lo que hace y listo para usar. 
Abre tu terminal y vamos a crear una carpeta para nuestro script y un archivo llamado backup_linux.sh.

  • mkdir -p ~/scripts
  • nano ~/scripts/backup_linux.sh

Ahora si quieres puedes copiar y pegar el siguiente código. 

Acuérdate de modificar las rutas de ejemplo para adaptarlas a tu usuario y tus carpetas reales!


=======================================================================

#!/bin/bash

####################################

# SCRIPT PARA COPIA DE SEGURIDAD

####################################


# --- CONFIGURACION BASICA ---

ORIGEN="/home/tu_usuario/Proyectos"

DESTINO="/media/tu_usuario/disco_externo/Backups"

LOG="/var/log/backup_system.log" # Acuérdate de los permisos de escritura o muevelo a tu home

FECHA=$(date +"%Y-%m-%d %H:%M:%S")

# Nota: Puedes cambiar la variable LOG a:

# LOG="/home/tu_usuario/backup_system.log"


# --- INICIO DE LA COPIA ---

echo "----------------------------------------" >> "$LOG"

echo "[$FECHA] Iniciando copia de seguridad..." >> "$LOG"


# 1. Comprobar si nuestro directorio de origen existe

if [ ! -d "$ORIGEN" ]; then

    echo "[$FECHA] ERROR: El directorio $ORIGEN no existe." >> "$LOG"

    exit 1

fi


# 2. Comprobar si el destino esta montado/disponible, depende donde lo quieras

if [ ! -d "$DESTINO" ]; then

    echo "[$FECHA] ERROR:  $DESTINO no está disponible." >> "$LOG"

    exit 1

fi


# 3. Ejecutar rsync con parámetros optimizados:

echo "[$FECHA] Sincronizando..." >> "$LOG"

rsync -avh --delete "$ORIGEN/" "$DESTINO/" >> "$LOG" 2>&1


# 4. Verificar si rsync terminó con éxito (código de salida 0)

if [ $? -eq 0 ]; then

    echo "[$FECHA] Copia de seguridad completada correctamente." >> "$LOG"

else

    echo "[$FECHA] ALERTA!! rsync Error en copia de seguridad." >> "$LOG"

fi


echo "----------------------------------------" >> "$LOG"

=======================================================================


Cuando hacemos uso de rsync:

  • -a (archive)  -- Preserva permisos, enlaces simbólicos, marcas de tiempo y propietarios.
  • -v (verbose)  --  Nos muestra qué se está copiando.
  • -h (human-readable)  --  Enseña los tamaños de archivo en formato legible (KB, MB, GB).
  • --delete  --  ¡Cuidado! Borra en el destino los archivos que ya no existan en el origen (siempre que queramos una copia espejo exacta).


Guardamos el archivo en nano y le damos permisos de ejecución al script para que el sistema nos deje ejecutarlo:

  • chmod +x ~/scripts/backup_linux.sh


Es momento de probarlo, podemos invocarlo escribiendo:

  • ./backup_linux.sh


Es el momento de revisar si se ha generado tu archivo log o el destino para comprobar que los archivos se han sincronizado perfectamente. 


Automatización con Cronjobs 

Tener el script ya nos quita algo de trabajo pero si tienes que acordarte de ejecutarjo tú mismo cada noche... puede que algún día no nos acordemos! Para eso nos va de maravilla que estemos en un sistema basado en Unix ya que la automatización de tareas periódicas se gestiona mediante el daemon Cron. 

Para programar el script editaremos nuestra tabla de tareas programadas (crontab):

  • crontab -e


Tranquilo, si es la primera vez que lo abres, te preguntará qué editor quieres usar, yo siempre que pueda me decanto por nano, al final es el primero que toqué en su día y es con el que más cómodo me siento... cada uno a sus preferencias!

Ve al final del archivo y añade una nueva línea, la sintaxis de Cron utiliza 5 columnas temporales antes de indicar el comando a ejecutar:

[Minuto] [Hora] [Día_del_Mes] [Mes] [Día_de_la_Semana] [Script]


Si quieres que tu backup se ejecute todos los días a las 3:00 AM (hora para que no interrumpa tu jornada):

  • 0 3 * * * /home/tu_usuario/scripts/backup_linux.sh


Prefiero que se ejecute solo los domingos a la medianoche... ok! sería asi:

  • 0 0 * * 0 /home/tu_usuario/scripts/backup_linux.sh


En fin, es ir haciendo pruebas y cada uno hacer su propia configuración. Guardamos el archivo y cerramos el editor y listo!! El sistema se encargará de ejecutar el script en segundo plano sin que te enteres.

Te recomiendo buenas prácticas de seguridad aplicadas al Backup, tus respaldos contienen copias exactas de tus bases de datos, claves SSH públicas, código y documentación y si no las proteges bien... pueden convertirse en un vector de ataque, recuerdalo!! 


Mis recomendaciones básicas:

1) Protege tu script y copias, solo tú (y root) debería poder leer o modificar tus scripts de copia de seguridad o las carpetas de destino. 

2) Backups remotos seguros (con llaves SSH por ejemplo)

Si modificas tu script para mandar tu backup a un servidor remoto mediante rsync sobre SSH, NUNCA NUNCA uses contraseñas escritas en texto plano en el código, lo normal sería configurar autenticación con llaves criptográficas públicas sin contraseña (ssh-keygen y ssh-copy-id).

3) Verifica de vez en cuando, no confíes ciegamente en que el script funciona porque "no da error"... Una vez al mes yo entraría a la carpeta de la de seguridad, recupera algún archivo y probaría que se abra correctamente. Un backup que no se puede restaurar no sirve de nada!


Conclusión

Automatizar copias en Linux con Bash y rsync lleva apenas 10 min, 15 lo maximo, pero te puede salvar de perder noches enteras de trabajo.  

¡Adapta el script, configura tu cronjob y deja que Linux haga el trabajo sucio!¿Tienes alguna duda configurando el script? ¡Déjala abajo en los comentarios y lo resolvemos juntos! 


>_Saludos!


No hay comentarios:

Publicar un comentario

Automatiza tus copias de seguridad ( Linux con Bash y rsync )

La terminal de Linux impone respeto pero una vez que dominas sus comandos básicos, te das cuenta de que la consola de Linux no es tu enemiga...