Comando scp en Linux: copiar archivos a un VPS (rsync, sftp)
- 14 de noviembre de 2026
- 09:00
- Por Adrien Roche
- Tutoriales

El comando scp en Linux: sintaxis y transferencias básicas
scp (secure copy) copia archivos entre máquinas a través de SSH, así que el usuario, la clave y el puerto que funcionan con ssh funcionan con scp. La forma es siempre scp [options] ORIGEN DESTINO, y el lado remoto se escribe user@host:path. Necesita un acceso SSH operativo; si el puerto 22 aún no responde, activa SSH en Ubuntu y fortíficalo primero.
1. De local a remoto (subida)
scp backup.tar.gz user@SERVER_IP:/home/user/
scp backup.tar.gz user@SERVER_IP:~/backups/renamed.tar.gz
scp *.conf user@SERVER_IP:~/nginx-conf/
Una ruta terminada en barra deja el archivo dentro de ese directorio con su nombre original; una ruta completa lo renombra al llegar. Puedes indicar varios archivos locales antes del destino siempre que el destino sea un directorio, y ese directorio ya debe existir: scp no crea los directorios padre.
2. De remoto a local (descarga)
scp user@SERVER_IP:/var/log/nginx/access.log .
scp user@SERVER_IP:'/var/log/nginx/*.log' ./logs/
El punto significa «aquí, con el mismo nombre». Entrecomilla los comodines remotos para que tu shell local no los expanda. También funciona de remoto a remoto: scp -3 user@HOST_A:/data/dump.sql user@HOST_B:/data/ encamina la copia por tu máquina, así que solo tu máquina necesita credenciales para ambos servidores.
3. Directorios con -r
scp -r ./site user@SERVER_IP:/var/www/
scp -r user@SERVER_IP:/etc/nginx ./nginx-backup
-r copia un directorio y todo su contenido. El primer comando crea /var/www/site en el servidor; el segundo descarga todo el árbol de nginx a una carpeta local. Los enlaces simbólicos se copian como archivos normales, una razón por la que rsync es mejor herramienta para árboles de sistema completos.
Opciones de scp que usarás de verdad: -P, -i, -C, -p
scp -P 2222 file.txt user@SERVER_IP:/home/user/ # non-default SSH port
scp -i ~/.ssh/id_ed25519 file.txt user@SERVER_IP:~/ # use a specific key
scp -C dump.sql user@SERVER_IP:~/ # compress in transit
scp -rp ./site user@SERVER_IP:/var/www/ # keep times and modes
La opción de puerto es una P mayúscula: -P. La -p minúscula significa «conservar fechas de modificación, de acceso y bits de permisos», y como ssh usa -p para el puerto, confundirlas es el error más habitual con scp. Para no repetir el puerto y la clave en cada llamada, define el host una vez en ~/.ssh/config; scp, rsync y sftp lo leen:
Host vps
HostName SERVER_IP
User user
Port 2222
IdentityFile ~/.ssh/id_ed25519
Dos opciones más: -l 8000 limita la transferencia a 8.000 Kbit/s (aproximadamente 1 MB/s), y -v muestra qué claves se ofrecen cuando falla la autenticación. Desde OpenSSH 9.0, scp habla el protocolo SFTP por debajo; la sintaxis no cambia, pero los trucos de shell incrustados en una ruta remota (una sustitución de comandos, por ejemplo) ya no se ejecutan en el servidor, y -O restaura el protocolo antiguo para un servidor muy viejo que rechace el modo nuevo.
rsync: réplicas, transferencias reanudables y exclusiones
rsync copia solo lo que ha cambiado. La primera ejecución se comporta como scp -r; las siguientes comparan ambos lados y envían solo las diferencias: los archivos nuevos y, en los modificados, únicamente los bloques alterados. Eso lo convierte en la herramienta para despliegues, copias de seguridad y cualquier cosa voluminosa. Debe estar instalado en ambos extremos (sudo apt install rsync); algunas imágenes mínimas y contenedores no lo incluyen.
1. El comando de cada día
rsync -avz --progress ./site/ user@SERVER_IP:/var/www/site/
rsync -avz --progress user@SERVER_IP:/var/www/site/ ./site-backup/
-a (archive) equivale a -rlptgoD: recorre recursivamente, mantiene los enlaces simbólicos como tales, conserva permisos, fechas, grupo, propietario y archivos de dispositivo; la propiedad solo se conserva cuando el lado receptor se ejecuta como root. -v lista los archivos, -z comprime y --progress muestra cada archivo.
La barra final importa. ./site/ significa «el contenido de site»; ./site significa «el directorio en sí», lo que crearía /var/www/site/site. Ante la duda, añade -n (--dry-run) y lee la lista de archivos antes de escribir nada.
2. Réplica exacta con --delete
rsync -avzn --delete ./site/ user@SERVER_IP:/var/www/site/ # dry run first
rsync -avz --delete ./site/ user@SERVER_IP:/var/www/site/
--delete elimina los archivos del destino que ya no existen en el origen. Una réplica real lo necesita, y es también lo que convierte una barra final equivocada en un directorio borrado, así que prueba en seco cada nuevo comando con --delete una vez.
3. Excluir archivos
rsync -avz --exclude='node_modules/' --exclude='.git/' --exclude='*.log' ./app/ user@SERVER_IP:/srv/app/
rsync -avz --exclude-from='.rsyncignore' ./app/ user@SERVER_IP:/srv/app/
Los patrones son relativos a la raíz de la transferencia; una barra inicial los ancla, de modo que /config.php excluye únicamente el archivo del primer nivel. --exclude-from lee un patrón por línea.
4. Reanudar una transferencia parcial, puerto y clave personalizados
rsync -avP -e 'ssh -p 2222 -i ~/.ssh/id_ed25519' ./disk.img user@SERVER_IP:/backup/
-P es la abreviatura de --partial --progress: si la conexión se corta, el archivo parcial se conserva y volver a ejecutar el mismo comando continúa desde donde se detuvo. Las opciones de SSH se pasan con -e, y aquí el puerto es -p en minúscula porque es la opción de ssh, no de rsync; una entrada Host en ~/.ssh/config elimina toda la cadena -e.
sftp: transferencias interactivas con el mismo acceso SSH
sftp te da un prompt estilo FTP sobre SSH, práctico para explorar antes de copiar.
sftp -P 2222 -i ~/.ssh/id_ed25519 user@SERVER_IP
sftp> ls -l /var/www
sftp> lcd ~/Downloads
sftp> get /var/log/syslog
sftp> put -r ./site /var/www/
sftp> reget backup.iso
sftp> bye
Los comandos que empiezan por l actúan sobre tu máquina (lcd, lls, lpwd); el resto, sobre el servidor. put -r y get -r copian directorios, reget y reput reanudan un archivo interrumpido, y !command ejecuta un comando local sin salir de la sesión. sftp -b commands.txt user@SERVER_IP reproduce un archivo con estos comandos para tareas de cron.
Copiar archivos desde Windows: scp en PowerShell y WinSCP
Windows 10 (1809 y posterior) y Windows 11 incluyen el cliente OpenSSH, así que scp, sftp y ssh existen en PowerShell con las mismas opciones que en Linux:
cd C:\Users\you\Projects
scp -P 2222 -i $HOME\.ssh\id_ed25519 .\site.zip user@SERVER_IP:/home/user/
scp -r user@SERVER_IP:/var/www/site $HOME\Downloads
Las claves están en C:\Users\you\.ssh\, junto a known_hosts, y ssh-keygen -R SERVER_IP también funciona ahí. Usar rutas relativas tras un cd evita cualquier confusión entre una letra de unidad y un nombre de host. rsync no viene incluido; la forma más limpia de tenerlo es WSL: wsl rsync -avz /mnt/c/Users/you/site/ user@SERVER_IP:/var/www/site/.
Para una interfaz gráfica, WinSCP es la opción habitual: habla SFTP y SCP, ofrece una vista de dos paneles con arrastrar y soltar, y su comando Synchronize hace aproximadamente lo mismo que rsync --delete. Espera las claves en el formato .ppk de PuTTY y se ofrece a convertir una clave OpenSSH cuando la seleccionas. Para todo lo que se despliegue de forma repetida, una línea de scp o rsync en un script es más fácil de revisar y automatizar.
scp, rsync o sftp: cuál usar
| Tarea | Mejor herramienta | Por qué |
|---|---|---|
| Un archivo, una sola vez | scp | Comando más corto, nada que instalar |
| Un directorio, primera copia | scp -r o rsync -a | Resultado equivalente |
| Despliegues o copias de seguridad repetidos | rsync | Solo se envían los datos modificados |
| Réplica con borrados | rsync --delete | scp no puede eliminar archivos |
| Reanudar un archivo grande | rsync -P o reget en sftp | scp reinicia desde cero |
| Explorar y luego elegir archivos | sftp o WinSCP | Listado interactivo |
| Miles de archivos pequeños | rsync o tar sobre ssh | La sobrecarga por archivo domina en scp |
| Windows sin WSL | scp en PowerShell o WinSCP | No hay rsync nativo |
Regla práctica: scp cuando puedas escribir el comando de memoria, rsync en cuanto vayas a ejecutarlo dos veces.
Consejos de velocidad que sí marcan la diferencia
- La compresión no es gratis.
-C(scp) y-z(rsync) reducen texto, volcados SQL y registros, pero desperdician CPU con tarballs, imágenes y vídeo. Sitopmuestrasshdal 100% durante una transferencia, quita la opción. - Agrupa muchos archivos pequeños. Los viajes de ida y vuelta por archivo dominan cuando subes un árbol de código; un solo flujo es más rápido:
tar czf - ./site | ssh user@SERVER_IP 'tar xzf - -C /var/www/'. - Prueba otro cifrado en enlaces rápidos. Cuando el cuello de botella es el propio proceso ssh,
scp -c aes128-gcm@openssh.comaprovecha las instrucciones AES integradas en casi cualquier CPU moderna. - Protege las transferencias largas. Ejecútalas dentro de
tmuxoscreenpara que una sesión caída no mate la copia, o usarsync -Py vuelve a lanzarla. - Verifica y limita el caudal.
sha256sum filedebe coincidir en ambos extremos;scp -lorsync --bwlimitevitan que una copia de seguridad ahogue a la aplicación.
Permisos, propiedad y errores comunes
Permission denied en la ruta de destino
scp: /var/www//html/: Permission denied significa que el inicio de sesión funcionó pero ese usuario no puede escribir ahí. Copia a tu directorio personal y mueve los archivos con sudo mv, da la propiedad del destino al usuario (sudo chown -R user:user /var/www/site), o con rsync añade --rsync-path="sudo rsync", que funciona cuando el usuario de acceso tiene sudo sin contraseña, tal como se configura en crear un usuario con permisos sudo en Linux. Subir como root evita el error pero deja archivos propiedad de root que un servidor web no puede escribir: aplica después sudo chown -R www-data:www-data /var/www/site.
Permission denied (publickey)
El servidor rechazó la autenticación. Comprueba el nombre de usuario, fuerza la clave con -i, añade -v; en el VPS, sudo journalctl -u ssh -n 30 indica el motivo.
Remote host identification has changed
Es lo esperado tras una reinstalación o un cambio de IP: la clave del host ya no coincide con ~/.ssh/known_hosts. Si efectivamente reconstruiste el servidor, ejecuta ssh-keygen -R SERVER_IP y vuelve a conectar. Si no fue así, averigua por qué antes de escribir ninguna contraseña.
No such file or directory
scp no crea directorios padre: ejecuta antes ssh user@SERVER_IP 'mkdir -p /var/www/site'. rsync crea solo el último componente del directorio (--mkpath, en rsync 3.2.3+, crea los padres).
rsync: command not found, o protocol data stream (code 12)
Falta rsync en uno de los dos lados; instala allí sudo apt install rsync y vuelve a intentarlo.
Scripts subidos que no se ejecutan
Los archivos procedentes de Windows no tienen el bit de ejecución y a menudo llevan finales de línea CRLF, lo que produce bad interpreter: No such file or directory. Corrige ambas cosas con chmod +x deploy.sh y sed -i 's/\r$//' deploy.sh; la parte del shebang se explica en qué es un archivo .sh y cómo lo ejecuta bash. Un último clásico: scp file.txt user@SERVER_IP sin los dos puntos tras el host es una copia local que crea en silencio un archivo llamado user@SERVER_IP.
Todo esto da por hecho un servidor al que accedes por SSH como root o como usuario con sudo, donde el límite es la propia transferencia y no una cuota. Un VPS Linux de rdp.monster es esa clase de máquina: acceso root completo, CPU y RAM dedicadas, ancho de banda ilimitado (fair-use), sin KYC, con pago en criptomonedas, desde 8,99 $ al mes, y el servidor está en línea unos 10 segundos después de que se confirme el pago, así que lo primero que ejecutes en él puede ser el scp del primer paso.
Preguntas frecuentes
¿Está obsoleto el comando scp?
scp mueve archivos mediante SFTP. El comando, sus opciones y su sintaxis user@host:path no cambian, así que los scripts existentes siguen funcionando; solo la expansión del shell dentro de rutas remotas se comporta de otro modo, y -O restaura el protocolo antiguo para los servidores que lo necesiten. Para automatizaciones nuevas, rsync o sftp son opciones más capaces, pero scp sigue siendo válido para copias puntuales.¿Puedo usar scp con contraseña en lugar de una clave SSH?
PasswordAuthentication yes, scp pide la contraseña y la copia continúa; no hay ninguna opción para pasar la contraseña en la línea de comandos, y herramientas como sshpass que lo hacen la dejan en el historial de tu shell. Los servidores fortificados suelen desactivar el acceso por contraseña, en cuyo caso scp falla con Permission denied (publickey) hasta que instalas una clave con ssh-copy-id. Las claves son además lo que permite ejecutar scripts sin supervisión.¿scp sobrescribe los archivos existentes sin preguntar?
-n (--dry-run) muestra qué cambiaría, --ignore-existing deja intactos los archivos que ya existen, --update omite los archivos más recientes en el destino y --backup --backup-dir=DIR conserva las versiones sustituidas. Para cualquier cosa irrecuperable, copia a un directorio nuevo y cámbialo después.¿Cómo copio archivos directamente entre dos servidores VPS?
rsync -avz /data/ user@OTHER_IP:/data/ (o scp -r) para que los datos no pasen nunca por tu conexión doméstica. Eso exige que el primer servidor tenga una clave que el segundo acepte. Si prefieres no dejar claves en los servidores, scp -3 user@HOST_A:/path user@HOST_B:/path copia a través de tu máquina usando solo tus credenciales locales, a cambio de descargar y subir todo una vez.Adrien Roche, Editor de infraestructura y hosting
Ingeniero de sistemas con más de 10 años operando flotas de Windows Server y Linux. Adrien mantiene la documentación de infraestructura de rdp.monster y escribe nuestras guías sobre RDP, hosting VPS, administración de servidores, redes y herramientas de privacidad.




