Lado a lado
| scp | sftp | rsync | |
|---|---|---|---|
| Mejor para | Una copia rápida | Explorar, cuentas restringidas | Sincronizar carpetas, archivos grandes |
| Necesita en el servidor | SSH con el subsistema SFTP, o scp con -O | SSH con el subsistema SFTP | SSH y rsync instalado |
| Envía solo los cambios | No | No | Sí |
| Reanudar | No | Sí, reget y reput | Sí, --partial |
| Opción de puerto | -P 2222 | -P 2222 | -e 'ssh -p 2222' |
scp
scp file.txt user@server:/tmp/
scp -r folder user@server:/tmp/
scp -P 2222 user@server:/var/log/app.log .
Desde OpenSSH 9.0, scp usa el protocolo SFTP y no el antiguo protocolo scp. Puedes verlo con scp -v, que imprime Sending subsystem: sftp. La ventaja práctica es que los nombres de archivo con espacios o caracteres especiales ya no necesitan comillas dobles.
Si el servidor no tiene el subsistema SFTP, la copia falla con subsystem request failed on channel 0. Añade -O para usar el protocolo antiguo:
scp -O file.txt user@server:/tmp/
Más casos, como carpetas, otros puertos y dos servidores, están en los ejemplos de scp.
sftp
sftp user@server abre un pequeño shell con ls, cd, get, put y bye. Funciona en cuentas que no tienen shell, así que es la opción habitual para usuarios restringidos. Consulta la configuración de un usuario solo sftp.
Todos los comandos del prompt están en la lista de comandos de sftp.
Puede reanudar. Dentro de sftp, estos comandos continúan un archivo parcial:
reput big.bin /tmp/big.bin
reget /tmp/big.bin big.bin
En nuestra prueba ambos terminaron a partir de un archivo parcial, y las sumas de verificación coincidieron con el original. Para scripts, pon los comandos en un archivo y ejecuta sftp -b commands.txt user@server.
rsync
rsync -av src/ user@server:/srv/app/
rsync -avz -e 'ssh -p 2222' src/ user@server:/srv/app/
rsync -aP big.bin user@server:/tmp/
-a conserva permisos, fechas y enlaces y copia carpetas. -v lista los archivos. -z comprime, lo que ayuda con texto en enlaces lentos. -P significa --partial --progress.
rsync tiene que existir en ambos lados. Si no está en el servidor, obtienes:
bash: line 1: rsync: command not found
La barra final
Una barra al final del origen cambia el resultado. Ejecutamos las dos formas sobre una carpeta src que contenía a.txt:
rsync -a src user@server:/tmp/noslash/ # creates /tmp/noslash/src/a.txt
rsync -a src/ user@server:/tmp/slash/ # creates /tmp/slash/a.txt
Con la barra, rsync copia el contenido de la carpeta. Sin ella, copia la carpeta misma. Una barra en el destino no cambia nada.
Enviar solo lo que cambió
En nuestra prueba, se envió una vez un archivo de 50 MiB y luego se cambiaron 4 KiB en medio:
- Primera transferencia: 52.441.699 bytes enviados.
- Segunda transferencia: 43.547 bytes enviados.
Este ahorro se produce a través de una red. Entre dos carpetas de una misma máquina, rsync volvió a copiar el archivo entero en nuestra prueba.
Reanudar
Detuvimos una transferencia de ese archivo con --partial, lo que dejó 15,4 MB en el destino. Al volver a ejecutar el mismo comando se reutilizaron esos bytes y se envió el resto, y cmp encontró el resultado idéntico al original. Sin --partial, rsync borra el archivo parcial cuando se interrumpe.
Dos trampas
- rsync puede omitir un archivo que cambió. Por defecto compara solo el tamaño y la fecha de modificación. En nuestra primera prueba el cambio de 4 KiB cayó dentro del mismo segundo que la copia anterior, con el mismo tamaño, y rsync no envió nada.
-ccompara sumas de verificación, a costa de leer cada archivo. --deleteborra archivos en el destino que no están en el origen. Con una ruta equivocada, pueden ser muchísimos archivos. Añade antes-npara ver la lista:rsync -avn --delete src/ user@server:/srv/app/.
En macOS reciente, /usr/bin/rsync puede ser openrsync y no el original: en nuestro Mac de pruebas rsync --version imprimió openrsync: protocol version 29. Las opciones de arriba funcionaron, pero no tiene todo, así que revisa la salida de rsync --version si se rechaza una opción.
Cuál elegir
- Un archivo, una vez:
scp. - Necesitas mirar primero, o la cuenta solo permite SFTP:
sftp. - La misma carpeta una y otra vez, o un archivo grande en una mala conexión:
rsync. - Tu editor y tus herramientas locales con los archivos del servidor: monta la carpeta con sshfs.
Los tres leen tu configuración SSH, así que una entrada Host guarda el puerto y el usuario. Consulta el archivo de configuración de SSH.
Preguntas
¿SFTP y scp son lo mismo?
No. sftp es un cliente interactivo para explorar y transferir archivos, y scp un comando de copia de una línea. Desde OpenSSH 9.0, scp usa por debajo el protocolo SFTP.
¿rsync es más rápido que scp?
Cuando el destino ya tiene una copia antigua, sí: rsync envía solo las partes cambiadas. En nuestra prueba, un cambio de 4 KiB en un archivo de 50 MiB envió unos 43 KB. Con un archivo nuevo, los dos envían el archivo entero.
¿rsync funciona por SSH?
Sí. Para una ruta remota rsync se conecta con ssh por defecto, pero rsync también tiene que estar instalado en el servidor.
Fuentes
- Notas de la versión OpenSSH 9.0
- scp(1), manual de OpenBSD
- sftp(1), manual de OpenBSD
- Manual de rsync(1)
- Cómo funciona rsync