rsync – 16 ejemplos prácticos

rsync

Rsync es una eficiente y versátil herramienta de sincronización que permite copiar/sincronizar ficheros localmente y desde/hacia cualquier dispositivo que soporte shell remoto o el servicio rsync (Rsync no soporta sincronización entre 2 dispositivos remotos). Rsync ofrece un gran número de opciones que permiten un control refinado de su comportamiento así como de los ficheros a sincronizar/copiar.

Rsync es famoso por su eficiente algoritmo de transferencia basado en deltas el cual reduce la cantidad de datos a transferir sobre la red ya que solo envía las diferencias existentes entre el fichero fuente y el fichero destino.

Rsync es ampliamente usado como herramienta para hacer copias de seguridad (backup) y copias espejos (mirroring)

Rsync encuentra los ficheros que se van a transferir usando por defecto un algoritmo de chequeo rápido (quick check), que busca los ficheros que cambiaron su tamaño o la última fecha de modificación.

Otras carecteristicas:

+ Permite copiar enlaces, dispositivos (en GNU/Linux todos los dispositivos se identifican como un tipo de fichero especial debajo del DIR /dev), propietario, grupo y permisos

+ Opciones de inclusión/exclusión de ficheros similar a GNU tar

+ Permite excluir ficheros al estilo CVS

+ Puede usarse de manera transparente cualquier shell remoto, incluyendo ssh o rsh

+ No require super privilegios

+ Soporte tuberías (pipelining) para minimizar el tiempo de transferencia

+ Soporta autenticación anónima a través del servicio rsync (ideal para hacer copias espejo)

Rsync puede acceder al host remoto usando un shell remoto como transporte o contactando directamente al sevicio rsync vía TCP. Si el destino contiene un doble punto simple (:) después del nombre del host entonces se usará el shell remoto como transporte. Si el origen o el destino contiene un doble punto doble (::) después del nombre del host o si especifica el protocolo rsync:// entonces Rsync contactará directamente el servicio rsync.

Si solo se especifica el origin entonces Rsync tendrá un comportamiento similar a ls -l.

Si se especifica caminos locales tanto en el origen como en el destino entonces Rsync sicronizará localmente los ficheros origen con el destino y funcionará como un comando copy (cp) mejorado.

Sinópsis

$ rsync [OPCIONES] origen destino

tanto el origen como el destino pueden tener este formato: usuario@nombre-del-host:camino, si no se especifica usuario se considera el de la sesión actual.

Ejemplos

1. Transferir/sincronizar ficheros usando comodines

Transferir todos los ficheros del DIR actual que case con el patrón *.c hacia el DIR src, relativo a $HOME del usuario actual, del host helios. Si algunos de los ficheros a transferir existen en el DIR remoto entonces Rsync solo enviará las diferencias preservando la fecha de modificación.

$ rsync -t *.c helios:src/

2. Transferir/sincronizar ficheros en modo archivo

Transferir todos los ficheros del DIR src/bar del host helios hacia el DIR local /data/tmp/bar. Los ficheros son sincronizados en modo «archivo» preservando enlaces simbólicos, dispositivos, atributos, permisos, propietarios, etc. adicionalmente se reduce la cantidad de datos a transferir al comprimir los ficheros durante la transferencia.

$ rsync -avz helios:src/bar /data/tmp
  • -a es un atajo a:
    • -r: transferencia recursiva
    • -l: transfiere/copia los enlaces simbólicos
    • -p: preserva los permisos
    • -t: preserva la fecha de modificación del fichero
    • -g: preserva el grupo al que pertenece el fichero
    • -o: preserva el propietario al cual pertenece el fichero
    • -D: transfiere/copia dispositivos y ficheros especiales (solo para el usuario root)
  • -v: Muestra información sobre el proceso de transferencia, puede incrementar la verbosidad repetiendo esta opción, por ejemplo: -vvv mostrará mucha más información que -vv
  • -z: Comprime los datos durante la transferencia.

3. Transferir/sincronizar el contenido de un DIR

Si se especifica un / al final de src/bar entonces en lugar de crearse el DIR bar en /data/tmp se copiará el contenido de bar. Un slash al final del origen puede interpretarse como «copiar el contenido de este directorio» en lugar de «copiar este directorio»

$ rsync -avz helios:src/bar/ /data/tmp

4. Transferir/sincronizar determinados ficheros

Especificar varios ficheros a la vez. Copia los ficheros: fich1, fich2, fich3 y fich4 desde helios hacia el DIR local /dest/. Todas las sentencias especificadas a continuación son equivalentes.

$ rsync -av helios:fich1 :fich2 :fich3 :fich4 /dest/
$ rsync -av helios:fich1 helios:fich2  helios:fich3 helios:fich4 /dest/
$ rsync -av helios:fich1 :fich2 helios:fich{3,4} /dest/
$ rsync -av helios:fich{1,2,3,4} /dest/

5. Transferir/sincronizar ficheros con espacio en blanco

Para copiar un fichero que contiene espacios en blanco use el argumento –protect-args (-s)

$ rsync -avs helios:'yo soy un fich con espacio en blanco.txt' /dest/

6. Deshabilitar una opción

Para deshabilitar una opción determinada que está implícitamente activa en una opción precedente le prefijamos un no, si en el ejemplo 2 quisieramos que el propietario de los ficheros sea el usuario que recibe los ficheros en el servidor remoto entonces ejecutaríamos

$ rsync -avz --no-o helios:src/bar /data/tmp

7. Establecer permisos especifícos en los ficheros a transferir

Para establecer permisos especifícos usamos la opción chmod por ejemplo si queremos la siguiente configuración de permisos:

– Que no se preserve el bit pegajoso (sticky bit) para el propietario y grupo
– Que el grupo solo tenga acceso de lectura y ejecución sobre los DIR
– Que el grupo solo tenga acceso de lectura sobre los FIC
– Que el resto no tenga ningun permisos sobre DIR y FICH

Ejecutaríamos

$ rsync -avz --chmod=ug-s,Dg=rx,Fg=r,o-rwx helios:src/bar /data/tmp

8. Mapear el propietario y grupo a un usuario y grupo especifíco

$ rsync -avz --chown=root:librebyte /data/tmp  helios:src/bar

El comando anterior establece como propietario root y grupo librebyte a los ficheros enviados al servidor remoto.

Si el usuario que recibe los ficheros no tiene permisos para modificar el propietario y el grupo entonces rsync emitirá un mensaje de error.

El usuario y el grupo que recibe debe existir o si no rsync emite un mensaje de error.

Para mayor control sobre el mapeo de usuario y grupo use las opciones –usermap y –groupmap respectivamente. No use estas 2 opciones conjuntamente con –chown.

9. Usando caminos relativos

Significa que el camino especificado es envíado completamente al servidor remoto en lugar de la última parte del nombre de los ficheros por ejemplo:

$ rsync -av /foo/bar/baz.c helios:/tmp/

El comando anterior crea el fichero baz.c debajo del DIR tmp en el sevidor helios mientras que

$ rsync -avR /foo/bar/baz.c helios:/tmp/

crea el fichero /foo/bar/baz.c debajo del DIR tmp. Como habrá notado el comando anterior incluye la opción -R la cuál especifica el uso de caminos relativos, esta opción tiene su equivalente en la forma larga: –relative.

Si desea enviar solo una parte del camino especificado entonces inserte un ./, por ejemplo el siguiente comando creará el fichero /tmp/bar/baz.c nótese que el DIR foo no será creado en el DESTINO.

$ rsync -avR  /foo/./bar/baz.c helios:/tmp/ 

10. Copias de seguridad

Puede hacer copias de seguridad usando la opción –backup.

$ rsync -avz --delete --backup conf helios:conf

El comando anterior solo mantiene 2 versiones de los ficheros (el original y una copia) si quiere mantener varias copias entonces use la opciones –suffix y –backup-dir, por ejemplo el siguiente comando mantiene varias copias en el dir backup la opción –suffix añade al nombre del fichero la fecha en que se hace la copia de seguridad.

$ rsync -avz --delete --backup --backup-dir=../backup --suffix=_$(date +%Y-%m-%d.%H.%M) conf/ helios:conf/

El DIR backup se creará en el DIR padre del DIR conf (es posible especificar un camino absoluto).

11. Copias parciales

Si la conexión se interrumpe rsync, por defecto, eliminará cualquier transferencia parcial, para modificar este comportamiento use las opciones –partial o –partial-dir, se recomienda usar –partial-dir en lugar de –partial. Rsync comenzará a partir donde se quedó en el momento en que se interrumpió la conexión. Rsync creará y eliminará automáticamente el DIR especificado en –partial-dir.

$ rsync -avz  --partial-dir=../tmp-partial documents/ helios:mydoc

El DIR tmp-partial se creará dentro del DIR mydoc del servidor helios (es posible especificar un camino absoluto), –partial-dir tiene un comportamiento diferente la opción –backup-dir en cuanto al lugar en donde se creará el DIR especificado si en ambos se establecen caminos relativos.

12. Transfiriendo ACL y atributos extendidos

Las opciones -A y -X permiten sincronizar ACL (lista control de acceso) y atributos extendidos respectivamente. Tengáse en cuenta que el sistema de fichero destino debe soportar ambas opciones y ser compatible con el sistema de fichero origen.

$ rsync -aAXvz  ~/documents/ helios:~/documents/

13. Borrando ficheros extraños

La opción –delete permite eliminar los ficheros que se encuentran en el destino pero que no están en el origen, esta opción es útil para realizar copias espejos. Por ejemplo si quisieramos hacer una copia espejo de nuestros sitios web:

$ rsync -avz --delete /var/www helios:/var/www

14. Filtros

rsync permite incluir, excluir los ficheros a sincronizar/transferir usando las opciones:

* –cvs-exclude: Es un atajo para excluir ficheros que por lo general no se sincronizan o transfieren (*.old *.bak *.BAK *.orig *.rej .del-* *.a *.olb *.o *.obj *.so *.exe *.Z *.elc *.ln core .svn/ .git/ .hg/ .bzr/ …).

* –exclude=PATRON: Excluye los ficheros que casan con un PATRON.

* –exclude-from=FICH: Excluye los ficheros que casan con los patrones especificados en FICH. Cada patrón debe ir en una línea diferente, las líneas que comienzan con # o ; son consideradas comentarios.

* –include=PATRON: Incluye los ficheros que casan con un PATRON.

* –include-from=FICH: Incluye los ficheros que casan con los patrones especificados en FICH. Cada patrón debe ir en una línea diferente, las líneas que comienzan con # o ; son consideradas comentarios.

* –files-from=FICH: Permite especificar una lista exacta de ficheros a transferir, útil si solo desea transferir a la vez algunos FICH de DIR diferente.

* –filter=REGLA: Esta es la opción más avanzada, compleja y flexible. Las opciones anteriores son simplificaciones de –filter.

Algunos ejemplos:

Excluir ficheros comunes

$ rsync -avz --cvs-exclude documents/ helios:doc

También es posible especificar una lista de ficheros a excluir creando un fichero .cvsignore en el DIR donde se encuentra los ficheros o también puede crearse un fichero .cvsignore en $HOME mezclándose ambas reglas. Los patrones especificados en .cvsignore deben ser separados por un espacio en blanco y no por un salto de línea. Partamos que tenemos la siguiente estructura de DIR.

documents/Notes /
├── .git
│ ├── branches
│ ├── hooks
│ ├── info
│ ├── logs
│ ├── objects
│ └── refs
├── .gitignore
├── Internet
├── MultiMedia
├── Security
│ └── adminstradores_de_contrasenas
├── SO_Tipos_UNIX
│ └── Debian_-_Ubuntu
├── VIM
└── .zim

Y queremos excluir el fichero .gitignore y el directorio .zim entonces crearíamos un fichero .cvsignore debajo del DIR Notes con los siguientes patrones:

.cvsignore .gitignore .zim

Si queremos excluir todo los ficheros ocultos bastaría con especificar el siguiente patrón en el fichero .cvsignore

.*

Usando –exclude y –exclude-from

Podemos obtener el mismo resultado anterior usando las opciones –exclude y/o –exclude-from

$ rsync -avz --exclude='.zim' --exclude='.git*' --exclude-from='documents/exclude-list.txt' documents helios:doc

El fichero exclude-list.txt:

*.exe
*.old
*.bak
*.BAK
*.orig
exclude-list.txt

15. Usando un puerto no estándard del servicio ssh

Si su administrador de red cambió el puerto en el cual el servicio ssh «escucha» entonces debe usar la opción -e

$ rsync -avz -e 'ssh -p 2222' /var/www helios:/var/www

En el comando anterior rsync instruye al shell ssh que use el puerto 2222 durante la conexión y transferencia de datos.

16. Usando la opción rsync-path

Esta opción es útil si rsync no se encuentra dentro del $PATH del dispositivo que recibe los ficheros o si antes de ejecutar rsync necesita ejecutar otro comando, por ejemplo sudo.

$ rsync --rsync-path='sudo rsync' -az  --no-o --no-g --no-p --delete /var/www sedlav@helios:/var/www

Un caso típico de la aplicación del comando anterior es cuando:

– La autenticacion via ssh del usuario root está deshabilitada.

– El usuario www puede autenticarse via ssh y tiene acceso al dir /var/www/ via sudo (para más información vea: Sudoers Manual).

Lecturas recomendadas

– man rsync


YouTube video

1 comentario en “rsync – 16 ejemplos prácticos”

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.