Cómo usar rsync por SSH

Ejecuta rsync -avz src/ user@server:/srv/app/. rsync usa SSH por defecto y envía solo lo que cambió. Tiene que estar instalado en las dos máquinas. La barra después de src/ significa el contenido de la carpeta, y sin ella obtienes /srv/app/src/. Para otro puerto añade -e "ssh -p 2222". Antes de usar --delete, ejecuta el mismo comando con --dry-run.

Actualizada el . rsync 3.5.0 en Debian 13 entre dos contenedores desechables.

El comando del que partir

rsync -avz src/ user@server:/srv/app/
  • -a copia carpetas y conserva permisos, fechas y enlaces.
  • -v lista los archivos que transfiere.
  • -z comprime durante la transferencia, lo que ayuda con texto en un enlace lento y aporta poco con archivos que ya están comprimidos.

Ejecútalo dos veces seguidas y la segunda no lista ningún archivo. Cambia un archivo y lista solo ese.

Para elegir entre las tres herramientas, consulta scp, SFTP o rsync.

La barra final

Una barra al final del origen cambia el resultado. Con una carpeta llamada site:

ComandoResultado en el servidor
rsync -a site server:www/www/site/index.html
rsync -a site/ server:www/www/index.html

Una barra al final del destino no cambia nada en esto.

Puerto o clave distintos

rsync -avz -e "ssh -p 2222" src/ user@server:/srv/app/
rsync -avz -e "ssh -i ~/.ssh/id_work" src/ user@server:/srv/app/

Una entrada Host en tu configuración SSH también funciona y es más corta: rsync -avz src/ server:/srv/app/.

Archivos grandes: progreso y reanudación

rsync -aP big.bin user@server:/tmp/

-P significa --partial --progress. Sin --partial, rsync borra un archivo que no terminó. Con él, el archivo parcial se queda y la siguiente ejecución lo aprovecha. Detuvimos a medias una transferencia de 30 MB. Sin --partial no quedó ningún archivo en el servidor. Con él quedaron unos 4 MB, el mismo rsync -aP terminó el trabajo y las sumas de verificación de ambas copias coincidieron.

--dry-run y --delete

--delete borra en el destino los archivos que no están en el origen. Previsualiza siempre con --dry-run, o -n:

$ rsync -avn --delete site/ server:www2/
sending incremental file list
deleting oldfile
...
total size is 9  speedup is 0.05 (DRY RUN)

El archivo sigue ahí después de esto. Quita -n para hacerlo de verdad.

Tres formas en que --delete hace daño

  • Un origen vacío vacía el destino. Una ejecución en seco con una carpeta empty/ vacía como origen planeó borrar todo en el destino. Si falló un montaje y la carpeta de origen está vacía, eso es lo que obtienes.
  • Una barra equivocada borra más de lo que querías. El destino se compara con el origen tal como lo escribiste, así que con site contra www/, todo lo demás que haya en www/ se borra.
  • Las exclusiones interactúan con él. Los archivos excluidos se dejan en paz a menos que añadas --delete-excluded. En nuestra prueba eso eliminó debug.log del servidor.

Un límite detiene una ejecución que borraría demasiado. Sale con código 25:

$ rsync -a --delete --max-delete=1 empty/ server:www2/
Deletions stopped due to --max-delete limit (2 skipped)

Otras formas útiles

TareaComando
Descargarrsync -av server:www/ back/
Omitir archivosrsync -av --exclude='*.log' site/ server:www/
Ver qué cambiaría y por quérsync -ain site/ server:www/
Crear las carpetas que falten en el destinorsync -a --mkpath site/ server:a/b/c/

Sin --mkpath, un destino con más de una carpeta de profundidad falla con mkdir ... failed: No such file or directory.

Errores

Si rsync no está instalado en el servidor, recibes mensajes como estos, y la solución es instalarlo allí:

rsync: connection unexpectedly closed (0 bytes received so far) [sender]
rsync error: remote command not found (code 127)

Una carpeta de origen que no existe da change_dir ... failed: No such file or directory y el código de salida 23.

En un Mac

El rsync del Mac que usamos es openrsync, que informa rsync version 2.6.9 compatible. Manejó las opciones básicas de arriba, pero su ayuda no incluye --mkpath ni --append-verify. Si las necesitas, instala un rsync más reciente con Homebrew.

Preguntas

¿rsync por SSH necesita rsync en el servidor?

Sí. rsync se ejecuta en los dos extremos. Si falta en el servidor obtienes remote command not found (code 127).

¿Cómo uso rsync con otro puerto SSH?

Pasa el comando ssh con -e, por ejemplo rsync -avz -e "ssh -p 2222" src/ user@server:/srv/app/, o pon el puerto en una entrada Host de ~/.ssh/config.

¿Qué significa la barra final en rsync?

En el origen, src/ copia el contenido de la carpeta y src copia la carpeta misma. En el destino no cambia nada.

Fuentes

Más en SFTP y transferencia de archivos

Todas las guías