Rsync
es una herramienta para sincronizar los ficheros y directorios que tenemos almacenados en un sitio en otro diferente minimizando la transferencia de datos. En realidad, rsync
son dos cosas: unalgoritmo de delta compression para sincronizar dos ficheros similares y una utilidad que usa dicho algoritmo junto con otras técnicas para hacer mirroring de ficheros y directorios en otro sitio transfiriendo la mínima cantidad de datos posible.A nivel de un árbol de directorios con sus ficheros, la idea es sencilla.
rsync
nos copiará esos ficheros y directorios tal y como estaban en el nuevo sitio pero sin copiar todo, sino sólo lo que ha cambiado en el origen respecto al destino. Hacer lo mismo copiando los ficheros y directorios, incluso en remoto usando una carpeta compartida, sería equivalente si nos fijamos únicamente en el resultado, pero tenemos que transferir mucha más información.El listado de características especiales que nos da la página de man de rsync es:
- Soporte para copiar enlaces, ficheros de dispositivo, propietarios, grupos y permisos
- Opciones de exclusión (exclude y exclude-from) similares a las del GNU tar
- Modo CVS para ignorar los fichero que CVS ignoraría
- Se puede usar cualquier shell remota transparente, como ssh o rsh
- No es necesario ser root para usarlo
- pipelining de los ficheros transferidos para minimizar la latencia
- Soporte para usuarios anónimos o autentificados usando el demonio de rsync (ideal para hacer mirroring
NOTA IMPORTANTE:
La barra al final de los nombres de directorio
Respecto a cómo pasarle los nombres de los directorios, hay que tener una especial atención respecto a si ponemos una barra al final del nombre del directorio o no, ya que significan cosas distintas:
You can think of a trailing / on a source as meaning “copy the contents of this directory” as opposed to “copy the directory by name”, but in both cases the attributes of the containing directory are transferred to the containing directory on the destination. In other words, each of the following commands copies the files in the same way, including their setting of the attributes of /dest/foo:
rsync -av /src/foo /dest
rsync -av /src/foo/ /dest/foo
Efectivamente, /path/foo significa “el directorio foo“, mientras que /path/foo/ significa “lo que hay dentro de foo“.
RSYNC remoto
En la máquina destino es posible usar el propio proceso
rsync
funcionando como demonio y escuchando por defecto en el puerto 873 para recibir estas conexiones, pero es mucho más cómodo y fácil hacerlo por SSH, algo para lo que rsync ya está preparado por defecto.Para esto es conveniente configurar el cliente y el servidor de SSH involucrados para entrar de forma transparente usando autentificación por clave pública para evitar tener que introducir la contraseña cada vez, aunque no es estrictamente necesario.
Autentificación trasparente por clave pública/privada con OpenSSH
El primer paso es generar la pareja de claves pública/privada en el cliente con el comando ssh-keygen:
$ ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/home/supercoco/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/supercoco/.ssh/id_rsa.
Your public key has been saved in /home/supercoco/.ssh/id_rsa.pub.
The key fingerprint is:
5c:7b:3d:44:21:09:84:a1:e6:8b:42:4e:ec:39:d6:92 supercoco@cliente
Si no le especificamos opciones, el comando crea una clave RSA de 2048 bits, pero podemos cambiar este comportamiento. Por ejemplo, para clave DSA de 1024 bits, sería:
$ ssh-keygen -t dsa -b 1024
Generating public/private dsa key pair.
Enter file in which to save the key (/home/supercoco/.ssh/id_dsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/supercoco/.ssh/id_dsa.
Your public key has been saved in /home/supercoco/.ssh/id_dsa.pub.
The key fingerprint is:
91:84:38:fd:03:b4:74:5a:1c:ad:48:c4:da:57:3b:cc supercoco@cliente
Hay que tener en cuenta que si le especificamos una passphrase, tendremos que introducirla manualmente cada vez que queramos usar la clave privada, por lo que la autentificación no será transparente. Por ello, aunque no sea lo más seguro, para nuestro propósito es necesario dejarla en blanco.
Y ahora sólo tenemos que copiar el contenido el fichero
id_dsa.pub
o del id_rsa.pub
en el fichero authorized_keys
del directorio $HOME/.ssh/
del usuario del sistema con servidor SSH al que queremos acceder.Por ejemplo, si queremos entrar en el servidor SSH con el usuario
ranagustavo
, tendríamos que añadir el contenido de los ficheros/home/supercoco/.ssh/id_dsa.pub
o /home/supercoco/.ssh/id_rsa.pub
del cliente de SSH al fichero /home/supercoco/.ssh/authorized_keys
del servidor de SSH.Si tenemos la contraseña para entrar, podríamos incluso hacerlo desde el cliente con un par de comandos:
$ scp $HOME/.ssh/id_dsa.pub ranagustavo@servidor:id_dsa.pub.supercoco.cliente
Password:
id_dsa.pub
$ ssh ranagustavo@servidor 'cat id_dsa.pub.supercoco.cliente >> .ssh/authorized_keys'
y ya podemos entrar sin introducir la contraseña:
$ ssh ranagustavo@servidor
Linux servidor 2.6.22 #2 SMP Sun Dec 9 19:33:44 CET 2007 x86_64
The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.
Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
No mail.
Last login: Sun Jan 13 22:12:58 2008 from cliente
ranagustavo@servidor ~ $
Una vez que esté configurado correctamente, podemos incluso querer configurar el servidor de SSH para que no acepte clientes que quieran entrar por el método estándar, la contraseña. Para ello, partiendo de la configuración estándar de Debian (con otras configuraciones base, puede ser necesario hacer más cosas), sólo tenemos que cambiar los parámetros
ChallengeResponseAuthentication
y PasswordAuthentication
del fichero /etc/ssh/sshd_config
a “no
“:# Change to yes to enable challenge-response passwords (beware issues with
# some PAM modules and threads)
ChallengeResponseAuthentication no
# Change to no to disable tunnelled clear text passwords
PasswordAuthentication no
Ademas de agregar
AllowUsers usuario_que_tu_decidas
No permitir que root se pueda conectar
PermitRootLogin no
Con un “
/etc/init.d/ssh reload
” conseguiremos que el sshd relea la configuración.Agregamos en el .bashrc del usuario:
eval `ssh-agent`
ssh-add
Please use the script code below (modify as needed), as it will only sync to “touched” files. #!/bin/bash
rsync -avz –size-only -e “ssh -i /root/rsync-key” /etc/asterisk/extensions.confroot@192.168.1.3:/etc/asterisk/extensions.conf
rsync -avz –size-only -e “ssh -i /root/rsync-key” /etc/asterisk/voicemail.confroot@192.168.1.3:/etc/asterisk/voicemail.conf
rsync -avz –size-only -e “ssh -i /root/rsync-key” /etc/asterisk/queues.confroot@192.168.1.3:/etc/asterisk/queues.conf
rsync -avz –size-only -e “ssh -i /root/rsync-key” /etc/asterisk/sip.confroot@192.168.1.3:/etc/asterisk/sip.conf
rsync -avzr –size-only -e “ssh -i /root/rsync-key” /var/spool/asterisk/voicemailroot@192.168.1.3:/var/spool/asterisk
rsync -avzr –size-only -e “ssh -i /root/rsync-key” /var/lib/asterisk/mohroot@192.168.1.3:/var/lib/asterisk/moh
rsync -avzr –size-only -e “ssh -i /root/rsync-key” /var/lib/asterisk/soundsroot@192.168.1.3:/var/lib/asterisk
rsync -avzr –size-only -e “ssh -i /root/rsync-key” /home/PlcmSpIproot@192.168.1.3:/home
rsync -avzr –size-only -e “ssh -i /root/rsync-key” /var/www/html/root@192.168.1.3:/var/www