Comando scp: uso y opciones, copiar carpetas e indicar el puerto

Entorno de pruebaFamilia RHELAlmaLinux 9.8OpenSSH 9.9p1Lado receptor Debian 12 · OpenSSH 9.2p1Cuenta rootVerificado el 2026-10-28

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.

🧭 Dirección de copia de scp y rutas remotas
Diagrama explicativo
↔️ Dirección de copia
$ scp report.txt user@203.0.113.10:~/scp-test/user@203.0.113.10:~/scp-test/report.txt ./downloads/-3 user@203.0.113.10:~/scp-test/report.txt user@198.51.100.20:~/scp-test/
origen💻 Servidor que ejecuta el comandoreport.txt
➜
destino🖥️ Servidor remoto203.0.113.10:~/scp-test/
origen🖥️ Servidor remoto203.0.113.10:~/scp-test/report.txt
➜
destino💻 Servidor que ejecuta el comando./downloads/
origen🖥️ Servidor remoto A203.0.113.10:~/scp-test/report.txt
➜
Intermediario💻 Servidor que ejecuta el comando-3
➜
destino🖥️ Servidor remoto B198.51.100.20:~/scp-test/
🧩 Formato de la ruta remota
user la cuenta con la que te conectas, 203.0.113.10 la dirección del servidor o el dominio, :~/scp-test/ y tras los dos puntos, la ruta en ese servidor (la tilde es la carpeta personal)
Si escribes el archivo local primero y la ruta remota después, estás enviando. Si la ruta tras los dos puntos termina en barra, el archivo se guarda dentro de esa carpeta con el mismo nombre.
Si escribes primero la ruta remota, estás recibiendo. El archivo recibido queda en la ruta local que escribiste después.
Cuando el origen y el destino son servidores remotos, desde OpenSSH 8.7 los datos pasan por el servidor que ejecuta el comando. Es el mismo método que al añadir -3.

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:00

Al 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:00

Si 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.txt
report.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.

Simulador del comando scpOpenSSH 9.9
[root@server work]#
Funciona solo dentro del navegador. En la lista de la izquierda ves los archivos del lado remoto, y con ↑↓ recuperas los comandos anteriores.

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.gz
backup.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.

ComandoarchivoTiempo de ejecuciónVelocidad del indicador de progreso
scp backup.tar.gz20MB0,68 s53.6MB/s
scp -l 8000 backup.tar.gz20MB20.82 s996.5KB/s
scp access.log (3 veces)19MB0.79~0.89 s—
scp -C access.log (3 veces)19MB0.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 seconds

La 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ónTareaResultado en este artículo
-PIndica el puerto de conexión SSHEl puerto 22 completó el envío de report.txt; el puerto cerrado 2222 terminó con [Connection timed out]
-iIndica el archivo de clave privada para la autenticación de clave públicaEnvío de report.txt completado indicando ~/.ssh/id_ed25519
-rCopia los archivos y subcarpetas de la carpetaLas 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]
-pConserva la fecha de modificación, la de acceso y los permisos del origenLa 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
-CComprime los datos en la conexión SSHCon el registro de 19MB entre los dos servidores de este artículo, la opción con -C fue un poco más lenta
-lFija el límite de velocidad de transferencia en Kbit/sCon -l 8000, 20MB a 996.5KB/s en 20.82 segundos
-vMuestra el proceso desde la conexión hasta la transferencia en líneas debug1La línea [Sending subsystem: sftp] confirma la transferencia por SFTP
-3Transfiere 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
-OTransfiere con el antiguo protocolo SCPEn la salida de -v aparece [Sending command: scp -v -t]; las rutas con espacios necesitan una barra invertida más
-oPasa a ssh una opción en formato ssh_configCon ConnectTimeout=10 la espera fue de 10 segundos y se confirmó [Connection timed out]

📎 Otras opciones: según el manual oficial

OpciónTarea
-qDesactiva el indicador de progreso y los avisos y mensajes de diagnóstico de ssh
-JSe 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)
-FIndica otro archivo como archivo de configuración de usuario de ssh (se pasa tal cual a ssh)
-4Obliga a usar solo direcciones IPv4
-6Obliga 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:00

La 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.txt
scp -p report.txt user@203.0.113.10:~/scp-test/report-p.txt
report.txt                                    100%   14     4.7KB/s   00:00
scp -O -p report.txt user@203.0.113.10:~/scp-test/report-Op.txt
report.txt                                    100%   14     4.2KB/s   00:00
ssh 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.txt

report-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:00

Sin -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_ed25519

El 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:00

Es 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íascprsync
Alcance de la transferenciaTodos los archivos indicados en cada ejecuciónSolo los archivos cambiados respecto al origen
Conservar archivos recibidos a medias (--partial)❌✅
Borrar archivos que no están en el origen (--delete)❌✅
Enlaces simbólicosLos sigue y copia los archivos originalesCon -a, conserva los enlaces
Necesario en el lado receptorAcceso SSH y servidor SFTPrsync 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 directory

Al 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 closed

Si 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:00

Al 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 target

En 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:00

Si 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.txt
report.txt                                    100%   14     5.6KB/s   00:00

El 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

Si existe un archivo con el mismo nombre, se sobrescribe con el nuevo sin pedir confirmación. Al enviar el mismo report.txt a la misma carpeta varias veces, también se transfirió cada vez sin preguntar. Por eso, los archivos que debas conservar envíalos con otro nombre al final de la ruta de destino.

Si pones * en la ruta remota y la envuelves entre comillas simples, se traen todos los archivos del servidor remoto cuyo nombre coincida. Al traer report-*.txt del servidor remoto se transfirieron por orden los seis archivos coincidentes. Las comillas sirven para que el shell del servidor que ejecuta el comando no interprete * primero.

Con -B se ejecuta en modo por lotes, que no pide contraseña ni frase de contraseña. Según el manual oficial, en este modo no se puede introducir la contraseña, así que para tareas automáticas como cron configura primero la autenticación con clave.

🧭 Contenido recomendado sobre comandos de red 13 artículos · 2 referencias
🗂️ Comandos de red
📄 Comando ip 📄 Comandos netstat · ifconfig 📄 Comando nmtui
📄 Comando SSH 📄 Comando rsync 📄 Comando wget 📄 Comandos rz · sz 📄 Comando scp
📄 Comando host 📄 Comando nslookup
📄 Comando iptables 📄 Comando firewall-cmd 📄 Comando certbot

ℹ️ 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.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Demuestra que eres humano: 3   +   10   =