Comando scp: uso y opciones, copiar carpetas e indicar el puerto
scp es la herramienta de copia que se usa para intercambiar archivos con un servidor al que te conectas por SSH. Cuando envías un archivo con el comando scp, escribes primero el origen y después el destino, igual que con cp. Al enviar archivos y carpetas de un servidor AlmaLinux 9 a un servidor Debian 12 y traerlos de vuelta, la transferencia se realizó con el protocolo SFTP y un archivo de 20MB llegó en menos de 1 segundo.
Toda la salida de abajo es el resultado tal cual de ejecutar el scp de OpenSSH 9.9 con la cuenta root del lado emisor. Solo se cambiaron las direcciones de servidor y los nombres de cuenta por valores de ejemplo.
1️⃣ Uso de scp y rutas remotas
Delante de una ruta del servidor remoto se pone [cuenta@dirección del servidor:]. Una ruta sin dos puntos se interpreta como una ruta del servidor donde ejecutaste el comando, así que el lado que lleva los dos puntos decide si envías o recibes.
Envía report.txt de la carpeta actual a la carpeta scp-test, dentro del directorio personal del servidor remoto.
scp report.txt user@203.0.113.10:~/scp-test/report.txt 100% 14 5.1KB/s 00:00Al terminar la transferencia aparecen en una línea el nombre del archivo, el progreso, el tamaño, la velocidad y el tiempo empleado. Este indicador de progreso solo aparece al ejecutar en una terminal. Por eso, si rediriges la salida a un archivo, en el archivo no queda nada.
Para traer un archivo, escribe primero la ruta remota y después la ruta local donde guardarlo.
scp user@203.0.113.10:~/scp-test/report.txt ./downloads/report.txt 100% 14 2.7KB/s 00:00Si la ruta de destino termina en un nombre de archivo y no en una carpeta, se guarda con ese nombre. Tras enviarlo con el comando de abajo, en la carpeta receptora report.txt quedó con el nombre report-1028.txt.
scp report.txt user@203.0.113.10:~/scp-test/report-1028.txtreport.txt 100% 14 4.6KB/s 00:00🔲 Simulador del comando scp
En el simulador de abajo puedes escribir tú mismo comandos de envío, recepción y copia de carpetas y comprobar la salida de cada opción.
2️⃣ Opciones del comando scp
Las opciones van justo después de scp, antes del origen. -P, que indica el puerto, va en mayúscula, y -p en minúscula conserva las fechas y los permisos, así que si cambias la mayúscula se ejecuta otra acción.
-l fija el límite de velocidad de transferencia en Kbit/s. Sin opciones, un archivo de 20MB terminó de transferirse en menos de 1 segundo.
scp backup.tar.gz user@203.0.113.10:~/scp-test/backup.tar.gz 100% 20MB 53.6MB/s 00:00-l 8000 equivale a unos 1,000KB por segundo. Al enviar el mismo archivo con -l 8000, la velocidad del indicador de progreso fue de 996.5KB/s y la transferencia tardó 20 segundos.
scp -l 8000 backup.tar.gz user@203.0.113.10:~/scp-test/backup-l.tar.gzbackup.tar.gz 100% 20MB 996.5KB/s 00:20-C comprime los datos en la conexión SSH de la misma forma que gzip. Al enviar tres veces un archivo de registro de 19MB con frases repetidas, entre estos dos servidores la opción con -C fue un poco más lenta.
| Comando | archivo | Tiempo de ejecución | Velocidad del indicador de progreso |
|---|---|---|---|
| scp backup.tar.gz | 20MB | 0,68 s | 53.6MB/s |
| scp -l 8000 backup.tar.gz | 20MB | 20.82 s | 996.5KB/s |
| scp access.log (3 veces) | 19MB | 0.79~0.89 s | — |
| scp -C access.log (3 veces) | 19MB | 0.84~0.97 s | — |
El tiempo de ejecución va desde que se inicia el comando hasta que se conecta y termina la transferencia. El manual de ssh también explica que la compresión ayuda en líneas lentas y retrasa la transferencia en redes rápidas.
-v muestra el proceso desde la conexión hasta la transferencia en líneas debug1, así que sirve para buscar la causa cuando no se conecta o se detiene en la autenticación. Como la salida es larga, seleccionamos con grep solo las líneas de autenticación y transferencia.
scp -v report.txt user@203.0.113.10:~/scp-test/ 2>&1 | grep -E 'Authenticated|Sending|Transferred'Authenticated to 203.0.113.10 ([203.0.113.10]:22) using "publickey".
debug1: Sending subsystem: sftp
Transferred: sent 2536, received 3248 bytes, in 0.1 secondsLa línea [Sending subsystem: sftp] significa que scp envió el archivo con el protocolo SFTP. Desde OpenSSH 9.0, scp usa SFTP de forma predeterminada. Si añades -O, transfiere con el antiguo protocolo SCP y en el mismo lugar aparece [Sending command: scp -v -t].
scp -O -v report.txt user@203.0.113.10:~/scp-test/ 2>&1 | grep -E 'Authenticated|Sending|Transferred'Authenticated to 203.0.113.10 ([203.0.113.10]:22) using "publickey".
debug1: Sending command: scp -v -t ~/scp-test/
Sending file modes: C0600 14 report.txt
Transferred: sent 2328, received 3036 bytes, in 0.1 seconds📌 Opciones principales: resultados de este artículo
| Opción | Tarea | Resultado en este artículo | |
|---|---|---|---|
| -P | Indica el puerto de conexión SSH | El puerto 22 completó el envío de report.txt; el puerto cerrado 2222 terminó con [Connection timed out] | |
| -i | Indica el archivo de clave privada para la autenticación de clave pública | Envío de report.txt completado indicando ~/.ssh/id_ed25519 | |
| -r | Copia los archivos y subcarpetas de la carpeta | Las carpetas css e images quedan en el lado receptor con la estructura original; sin ella, no se transfiere por el error [not a regular file] | |
| -p | Conserva la fecha de modificación, la de acceso y los permisos del origen | La fecha de modificación se conserva; en el lado receptor de este artículo, el permiso 600 solo se conservó en el archivo enviado con -O -p | |
| -C | Comprime los datos en la conexión SSH | Con el registro de 19MB entre los dos servidores de este artículo, la opción con -C fue un poco más lenta | |
| -l | Fija el límite de velocidad de transferencia en Kbit/s | Con -l 8000, 20MB a 996.5KB/s en 20.82 segundos | |
| -v | Muestra el proceso desde la conexión hasta la transferencia en líneas debug1 | La línea [Sending subsystem: sftp] confirma la transferencia por SFTP | |
| -3 | Transfiere los datos entre dos servidores remotos a través del servidor que ejecuta el comando (método predeterminado desde OpenSSH 8.7) | Envío de report.txt completado con dos carpetas del mismo servidor como origen y destino | |
| -O | Transfiere con el antiguo protocolo SCP | En la salida de -v aparece [Sending command: scp -v -t]; las rutas con espacios necesitan una barra invertida más | |
| -o | Pasa a ssh una opción en formato ssh_config | Con ConnectTimeout=10 la espera fue de 10 segundos y se confirmó [Connection timed out] |
📎 Otras opciones: según el manual oficial
| Opción | Tarea | |
|---|---|---|
| -q | Desactiva el indicador de progreso y los avisos y mensajes de diagnóstico de ssh | |
| -J | Se conecta primero a un host de salto y desde allí configura el reenvío TCP hasta el destino final (forma abreviada del ajuste ProxyJump; varios saltos se separan con comas) | |
| -F | Indica otro archivo como archivo de configuración de usuario de ssh (se pasa tal cual a ssh) | |
| -4 | Obliga a usar solo direcciones IPv4 | |
| -6 | Obliga a usar solo direcciones IPv6 |
3️⃣ Copiar carpetas con scp y conservar las fechas
Si indicas una carpeta sin opciones, scp muestra un error de que no es un archivo normal y no realiza la transferencia.
scp site-files user@203.0.113.10:~/scp-test/scp: local "site-files" is not a regular file
scp: failed to upload file site-files to ~/scp-test/Con -r se copian los archivos y las subcarpetas de la carpeta.
scp -r site-files user@203.0.113.10:~/scp-test/logo.png 100% 48KB 4.7MB/s 00:00
style.css 100% 15 5.0KB/s 00:00
index.html 100% 15 5.2KB/s 00:00La salida solo muestra nombres de archivo. En la salida de find del lado receptor, las carpetas css e images estaban bajo site-files con la estructura original.
ssh user@203.0.113.10 'cd ~/scp-test && find site-files'site-files
site-files/images
site-files/images/logo.png
site-files/index.html
site-files/css
site-files/css/style.css-r sigue los enlaces simbólicos de la carpeta y copia los archivos originales, así que para las carpetas en las que los enlaces deben seguir siendo enlaces conviene rsync -a.
-p conserva la fecha de modificación, la de acceso y los permisos del origen. Antes de enviar el report.txt original ajustamos su fecha de modificación al 1 de octubre de 2026 00:00 (UTC) y sus permisos a 600. Como la zona horaria del servidor receptor es UTC, el ls del lado emisor también se ejecutó con TZ=UTC.
TZ=UTC ls -l report.txt-rw------- 1 root root 14 Oct 1 00:00 report.txtscp -p report.txt user@203.0.113.10:~/scp-test/report-p.txtreport.txt 100% 14 4.7KB/s 00:00scp -O -p report.txt user@203.0.113.10:~/scp-test/report-Op.txtreport.txt 100% 14 4.2KB/s 00:00ssh user@203.0.113.10 'ls -l ~/scp-test/report.txt ~/scp-test/report-p.txt ~/scp-test/report-Op.txt'-rw------- 1 user user 14 Oct 1 00:00 /home/user/scp-test/report-Op.txt
-rw-rw-r-- 1 user user 14 Oct 1 00:00 /home/user/scp-test/report-p.txt
-rw-rw-r-- 1 user user 14 Oct 28 06:17 /home/user/scp-test/report.txtreport-p.txt, enviado con -p, y report-Op.txt, enviado con -O -p, conservaron la fecha original, y report.txt, enviado sin opciones, se guardó con la fecha del envío. En el servidor receptor, los permisos de los archivos enviados por SFTP quedaron en 664 incluso con -p, y solo el archivo enviado con el antiguo protocolo SCP (-O) conservó el 600.
Por eso, en los archivos cuyos permisos deban coincidir con el origen, comprueba los permisos con ls -l en el lado receptor después de enviarlos.
4️⃣ Indicar el puerto y el archivo de clave en scp
En los servidores a los que no se accede con el puerto 22 y la clave predeterminados, indica el puerto y la clave antes de enviar. -P indica el puerto de conexión SSH e -i, el archivo de clave privada para la autenticación de clave pública.
Abajo hay un ejemplo que indica directamente el puerto 22 y un archivo de clave. Si el servidor tiene otro puerto, escribe ese número en lugar de 22.
scp -P 22 -i ~/.ssh/id_ed25519 report.txt user@203.0.113.10:~/scp-test/report.txt 100% 14 5.3KB/s 00:00Sin -i, igual que ssh, prueba por orden las claves con nombres predeterminados de ~/.ssh (id_rsa, id_ecdsa, id_ed25519, etc.).
Si envías a menudo al mismo servidor, escribe un alias en ~/.ssh/config y en scp introduce solo el alias.
Host myserver
HostName 203.0.113.10
User user
Port 22
IdentityFile ~/.ssh/id_ed25519El nombre de la línea Host se convierte en el alias, y las cuatro líneas de debajo sustituyen a la dirección del servidor, la cuenta, el puerto y el archivo de clave. El comando con solo el alias terminó con el mismo resultado de una línea que al escribir la dirección y la clave completas.
scp report.txt myserver:~/scp-test/report.txt 100% 14 4.2KB/s 00:00-P, -i y los alias usan la configuración de conexión de ssh tal cual, así que el proceso de crear una clave y registrarla en el servidor también es el mismo que al conectarte con el comando SSH.
5️⃣ Copia entre servidores con scp
Aunque el origen y el destino sean servidores remotos, puedes copiar con una sola línea de scp. Desde OpenSSH 8.7 los datos se transfieren a través del servidor que ejecuta el comando, y este método es -3. Las notas de versión oficiales dan como motivo para hacerlo predeterminado que no hace falta guardar las credenciales del servidor de destino en el servidor de origen.
La medición de abajo se hizo con dos carpetas del mismo servidor como origen y destino. Si el servidor de destino es otro, cambia solo la cuenta y la dirección del final.
scp -3 user@203.0.113.10:~/scp-test/report.txt user@203.0.113.10:~/scp-test/copy3/report.txt 100% 14 2.5KB/s 00:00Es como si la sede central recibiera los documentos entre dos sucursales y los volviera a enviar.
El método antiguo, en el que el servidor de origen envía directamente al de destino, se indica con -R. Este método requiere que el servidor de origen pueda conectarse al de destino sin contraseña. Desde OpenSSH 10.6, usar -R muestra un aviso de obsolescencia, y está previsto que versiones posteriores ignoren esta opción y copien con el método -3.
6️⃣ Comparación de scp y rsync
Para enviar unos pocos archivos una vez basta con scp, y para sincronizar repetidamente la misma carpeta o reanudar una transferencia interrumpida es mejor el comando rsync. scp vuelve a enviar todos los archivos indicados en cada ejecución, mientras que rsync compara origen y destino y transfiere solo los archivos cambiados.
| Categoría | scp | rsync |
|---|---|---|
| Alcance de la transferencia | Todos los archivos indicados en cada ejecución | Solo los archivos cambiados respecto al origen |
| Conservar archivos recibidos a medias (--partial) | ❌ | ✅ |
| Borrar archivos que no están en el origen (--delete) | ❌ | ✅ |
| Enlaces simbólicos | Los sigue y copia los archivos originales | Con -a, conserva los enlaces |
| Necesario en el lado receptor | Acceso SSH y servidor SFTP | rsync instalado en ambos lados |
7️⃣ Mensajes de error del comando scp y soluciones
Cuando scp falla, la causa aparece tal cual en la primera línea de la salida. En los tres casos en que provocamos el error a propósito con un archivo inexistente, los permisos de escritura y un puerto incorrecto, la causa salió en la primera línea, y los códigos de salida tampoco fueron 0 en ningún caso.
🔲 No such file or directory
Si intentas traer un archivo que no existe en el lado remoto, se muestra [No such file or directory] junto con la ruta.
scp user@203.0.113.10:~/scp-test/nofile.txt ./downloads/scp: ~/scp-test/nofile.txt: No such file or directoryAl enviar, si la carpeta de destino no existe se produce el mismo error. scp no crea las carpetas que faltan, así que crea la carpeta antes ejecutando mkdir -p por ssh.
scp report.txt user@203.0.113.10:~/scp-test/nodir/sub/scp: dest open "scp-test/nodir/sub/": No such file or directory
scp: failed to upload file report.txt to ~/scp-test/nodir/sub/🔲 Permission denied
Si la carpeta receptora no tiene permiso de escritura, tras [dest open] sigue [Permission denied]. Abajo está el resultado de enviar a una carpeta readonly con permisos 555.
scp report.txt user@203.0.113.10:~/scp-test/readonly/scp: dest open "scp-test/readonly/report.txt": Permission denied
scp: failed to upload file report.txt to ~/scp-test/readonly/Si delante de [Permission denied] aparece [cuenta@dirección del servidor:] y entre paréntesis hay un método de autenticación como publickey, el rechazo ocurrió en la fase de autenticación de la conexión. Este texto es el formato que usa el programa ssh cuando falla la autenticación, así que comprueba primero el archivo de clave indicado con -i y la clave pública registrada en el servidor.
🔲 Connection timed out
Si el número de puerto es incorrecto o un cortafuegos bloquea ese puerto y no llega respuesta, tras esperar la conexión termina con [Connection timed out]. Abajo está el resultado de enviar al puerto cerrado 2222 con una espera de 10 segundos.
scp -P 2222 -o ConnectTimeout=10 report.txt user@203.0.113.10:~/scp-test/ssh: connect to host 203.0.113.10 port 2222: Connection timed out
scp: Connection closedSi aparece este error, comprueba primero que el número escrito en -P coincide con el puerto SSH del servidor.
🔲 Espacios y la tilde (~) en las rutas
El scp actual, que transfiere por SFTP, solo necesita envolver una vez entre comillas simples la ruta remota con espacios.
scp report.txt 'user@203.0.113.10:~/scp-test/my files/'report.txt 100% 14 4.7KB/s 00:00Al añadir -O al mismo comando para enviar con el antiguo protocolo SCP, falló con [ambiguous target]. Esto ocurre porque en el antiguo protocolo SCP el shell remoto interpreta la ruta una vez más.
scp -O report.txt 'user@203.0.113.10:~/scp-test/my files/'scp: ambiguous targetEn ese caso, pon una barra invertida delante del espacio para que el shell remoto también lo lea como una sola palabra.
scp -O report.txt 'user@203.0.113.10:~/scp-test/my\ files/'report.txt 100% 14 4.5KB/s 00:00Si la ruta tras los dos puntos empieza sin barra ni tilde, se trata con respecto a la carpeta personal de la cuenta remota.
scp report.txt user@203.0.113.10:scp-test/report-rel.txtreport.txt 100% 14 5.6KB/s 00:00El manual oficial indica que uses -O cuando un servidor SFTP antiguo no pueda convertir una ruta que empieza por tilde en la carpeta personal. En ese caso, escribir la ruta respecto a la carpeta personal sin tilde, como arriba, también guarda en el mismo lugar.
🔢 FAQ & contenido recomendado











ℹ️ Aviso de afiliados
El contenido de este sitio incluye enlaces de afiliado. Cuando un visitante compra un producto o servicio a través de uno de ellos, el sitio recibe una comisión del vendedor. El importe que paga el comprador(baja durante las promociones ↓)no aumenta. Los precios, descuentos y existencias publicados corresponden al momento de redacción y pueden variar, así que confírmalos con el vendedor antes de comprar. Los productos se eligen y evalúan con criterios propios, y las comisiones no influyen en el orden ni en el contenido de las reseñas.