RDP Monster

Comando scp en Linux: copiar archivos a un VPS (rsync, sftp)

Comando scp en Linux: copiar archivos a un VPS (rsync, sftp)

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

TareaMejor herramientaPor qué
Un archivo, una sola vezscpComando más corto, nada que instalar
Un directorio, primera copiascp -r o rsync -aResultado equivalente
Despliegues o copias de seguridad repetidosrsyncSolo se envían los datos modificados
Réplica con borradosrsync --deletescp no puede eliminar archivos
Reanudar un archivo grandersync -P o reget en sftpscp reinicia desde cero
Explorar y luego elegir archivossftp o WinSCPListado interactivo
Miles de archivos pequeñosrsync o tar sobre sshLa sobrecarga por archivo domina en scp
Windows sin WSLscp en PowerShell o WinSCPNo 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. Si top muestra sshd al 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.com aprovecha las instrucciones AES integradas en casi cualquier CPU moderna.
  • Protege las transferencias largas. Ejecútalas dentro de tmux o screen para que una sesión caída no mate la copia, o usa rsync -P y vuelve a lanzarla.
  • Verifica y limita el caudal. sha256sum file debe coincidir en ambos extremos; scp -l o rsync --bwlimit evitan 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 no se ha eliminado, pero desde OpenSSH 9.0 transfiere mediante el protocolo SFTP porque el protocolo scp original se declaró obsoleto.
Los desarrolladores de OpenSSH describieron el protocolo scp/rcp original como anticuado y difícil de asegurar, y desde OpenSSH 9.0 (2022) el comando 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?

Sí, si el servidor aún permite la autenticación por contraseña; scp la pide igual que hace ssh.
scp usa la misma autenticación que usaría ssh para ese host. Si sshd tiene 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?

Sí: scp y rsync sustituyen los archivos del destino en silencio, así que usa rsync --dry-run para previsualizar en caso de duda.
scp sobrescribe cualquier archivo existente con el mismo nombre en el destino sin avisar y sin opción de omitirlo. rsync también sobrescribe, pero solo cuando el origen difiere, y te da control: -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?

Ejecuta rsync o scp en un servidor apuntando al otro, o usa scp -3 para encaminar la copia por tu propia máquina.
La vía más rápida es de servidor a servidor: conecta por ssh al VPS de origen y ejecuta 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.

Regístrate en nuestro programa de revendedores

Tus datos

Si tienes alguna pregunta, contáctanos haciendo clic aquí !
Nombre y apellidos(Obligatorio)
Introduce tu correo electrónico; debes tener una cuenta en dashboard.rdp.monster !

Tu empresa

Introduce la dirección de tu sitio web si tienes uno
Explica brevemente cómo vas a vender los servicios a tus clientes. Por ejemplo, hablando con gente en foros.

¡Usamos cookies!

Utilizamos cookies para mejorar tu experiencia de navegación, mostrar anuncios o contenido personalizados y analizar nuestro tráfico. Al hacer clic en «Aceptar», consientes nuestro uso de cookies.