Automatizar copias de seguridad con rsync

Esta semana me he decidido por fin y he terminado de automatizar las copias de seguridad de mi escritorio ubuntu “Gutsy Gibbon” a un servidor debian “etch”.

He utilizado rsync para transmitir todos mis ficheros, herramienta muy versátil con la que realizo mis copias de seguridad de forma incremental en un único sentido, para mantener sincronizados 2 directorios en ambos sentidos podemos utilizar unison.

Partimos de que los scripts los ejecutaremos desde la máquina cliente hacia el servidor. Lo primero que debemos conseguir para transferir los ficheros de forma programada es tener acceso al servidor sin que sea necesaria nuestra intervención. Para ello debemos generar un par de claves publica/privada sin palabra de paso en la máquina cliente y autorizar nuestra clave pública en el servidor. Ejecutamos la utilidad ssh-keygen y generamos las claves:

[code]
javi@javi-dell:~/.ssh$ ssh-keygen -d
Generating public/private dsa key pair.
Enter file in which to save the key (/home/javi/.ssh/id_dsa): hola
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in hola.
Your public key has been saved in hola.pub.
The key fingerprint is:
cf:f5:d1:58:52:20:1a:4d:17:70:4c:fa:fc:e0:fc:f5 javi@javi-dell
[/code]

Hemos generado 2 ficheros: hola (clave privada) y hola.pub (clave pública). Con la opción -d indicamos que utilice el algoritmo dsa (ssh v1 utiliza claves rsa, mientras que ssh v2 utiliza claves dsa), a la primera pregunta respondemos con “hola” que será el nombre de nuestra clave, a continuación nos pedirá la palabra de paso, pulsaremos enter ya que no la necesitamos.

Ahora le mostraremos a nuestro servidor cual es la clave pública con la que nos vamos a conectar. Para ello copiamos el contenido del fichero hola.pub (nuestra clave pública) a una nueva linea del fichero /home/usuario/.ssh/authorized_keys de nuestro servidor, si no existe lo creamos.
Y probamos a conectar utilizando la clave creada:
[code]
ssh -i /home/usuario/.ssh/hola host
[/code]
Podemos utilizar la opción -v para imprimir los pasos que se realizan para conectar y la opción -2 para forzar a que conecte mediante ssh2 si este no es nuestro protocolo por defecto.

Con esto ya deberíamos tener nuestros equipos autentificados mediante claves dsa.

Procedemos a crear el script que ejecutará los backups backup.sh

[code]
#!/bin/bash

# ARRAY con los directorios origen a copiar
ORG[1]="/home/usuario/_TEMP/org1";
ORG[2]="/home/usuario/_TEMP/org2";
ORG[3]="/home/usuario/_TEMP/org3";

# ARRAY con los directorios destino
DEST[1]="/home/usuario/_TEMP/dest1";
DEST[2]="/home/usuario/_TEMP/dest2";
DEST[3]="/home/pepe/";

# Usuario y host de la conexion, dejar en blanco para copiar al mismo equipo o unidad extraible
conn[1]="";
conn[2]="";
conn[3]="pepe@picaso:";

# Opciones de rsync
opts[1]=" -ah";
opts[2]=" -ah";
opts[3]=" -avhe";

# Especificamos el fichero de clave para autentificación, dejar en blanco si no se utiliza
key[1]="";
key[2]="";
key[3]="ssh -i /home/pepe/.ssh/hola";

fecha=`date`

# Recorremos los arrays con los directorios a copiar
i=1;
for j in ${ORG[*]}; do

if (rsync ${opts[i]} "${key[i]}" ${ORG[i]} ${conn[i]}${DEST[i]} --log-file=backup.log ) then
echo "$fecha Sincronización terminada con EXITO" >> backup.log;
else
echo "$fecha se ha producido un ERROR durante la sincronización" >> backup.log;
fi
echo "-----------------------------------------------------------" >> backup.log;

i=`expr $i + 1` #Incrementamos contador en 1
done
[/code]

Y finalmente lo añadimos a nuestro cron para que se ejecute periódicamente, por ejemplo:
[code]
crontab -e

# m h dom mon dow command
00 22 * * * /home/usuario/backup.sh
[/code]
Le decimos que se ejecute todos los días a las 22h.