Cómo usar el comando SCP para transferir archivos
El comando SCP (Secure Copy Protocol) de Linux es un protocolo de transferencia de archivos en red que permite la transferencia de archivos fácil y segura entre un host remoto y uno local, o entre dos ubicaciones remotas. Se basa en el Protocolo de Copia Remota de Berkeley Software Distribution.
Los desarrolladores full-stack utilizan con frecuencia el comando SCP para sus funciones de autenticación y cifrado sin requerir servicios de alojamiento de terceros como Github. Es una forma fácil de evitar la exposición de tus datos a rastreadores de paquetes, y de preservar su confidencialidad.
En esencia, SCP es una mezcla de RCP y SSH (Secure Shell). Se basa en el primero para realizar operaciones de copia y en el segundo para cifrar la información y autenticar los sistemas remotos.
A diferencia de Rsync, todo lo que necesitas para usar la línea de comandos de SCP con éxito es un nombre de usuario y contraseña o frase de contraseña para los sistemas involucrados en la transferencia. Esto agiliza el proceso ya que no es necesario iniciar sesión en ninguno de ellos.
Transferir archivos de forma segura es primordial cuando se usa un VPS. Afortunadamente, se puede hacer fácilmente usando el comando SCP.
En este artículo aprenderás a usar los comandos SCP y cómo pueden ayudarte.
Tabla de Contenidos
Sintaxis de ejemplo del comando SCP en Linux
El ejemplo del comando SCP básico se ve así:
scp [other options] [source username@IP]:/[directory and file name] [destination username@IP]:/[destination directory]
Puede parecer complicado al principio, ¡pero con gusto lo desglosaremos!
En este ejemplo estamos realizando una transferencia entre dos servidores VPS.
- [other options] son modificadores que puedes agregar al comando SCP. Veremos los más populares más tarde.
- [source username@IP] es el nombre de usuario y la IP de la máquina que tiene el archivo que deseas. Se vería algo así como root@123.123.123.12
- :/ informa al comando SCP que estás a punto de escribir en el directorio de origen
- [directory and file name] es donde está ubicado el archivo, y su nombre. Se ve algo así /usuarios/Gustavo/Escritorio/SCP.png
- [destination username@IP] es el nombre de usuario y la IP de la máquina de destino.
- [destination directory] por último, está el directorio de destino donde se guardará el archivo.
En un escenario del mundo real se vería así:
scp -p root@162.168.1.1:/media/scp.png edward@162.168.1.2:/desktop/destination
¡Es bastante simple! Si estás copiando hacia o desde una máquina local, no necesitarás la dirección IP, el destino o la ruta de origen como /escritorio/nombre_de_carpeta.
Hablemos de otras opciones que puedes usar para modificar el comando SCP. Hay 20 comunes que puedes usar tanto en forma de un solo caracter (-o), como en su equivalente descriptivo (–option). Las opciones más utilizadas son:
- –P port permite especificar una entrada diferente al servidor (el puerto predeterminado para el puerto TCP para el comando es 22)
- –c cipher te da la posibilidad de especificar el algoritmo de cifrado que utilizará el cliente. Algunos de los valores que puedes usar son ‘aes256-ctr’, ‘aes256-cbc’, ‘blowfish-cbc’, ‘arcfour’, ‘arcfour128’, ‘arcfour256’, ‘cast128-cbc’, aes128-ctr’, ‘aes128-cbc’, ‘aes192-ctr’, ‘aes192-cbc’, y 3des-cbc’. La opción predeterminada en la configuración de shell es ‘AnyStdCipher’
- –q ejecutará la operación en modo silencioso (quiet), lo que significa que solo se mostrarán los errores críticos.
- –r es para copia recursiva, que incluirá todos los subdirectorios.
- –4 o -6 se pueden usar si quieres elegir la versión de protocolo empleada, ya sea IPv4 o IPv6. También puedes configurar los requisitos de dirección IP de manera más exhaustiva con la palabra clave de la familia de direcciones (address-family keyword).
- –p conservará los tiempos de modificación iniciales y los atributos del archivo.
- –u borrará el archivo fuente después de que se complete la transferencia.
- –c permitirá la compresión de los datos mientras se lleva a cabo la operación de transferencia.
Aspectos a tener en cuenta
Como SCP utiliza el cifrado SSH, necesitarás la contraseña ssh para que se realice la transferencia de archivos. Además, es necesario tener permiso de lectura en la máquina de la que estás a punto de copiar y privilegios de escritura en la(s) máquina(s) a la que copiarás.
Para la autenticación y la configuración de la conexión, deberás generar un par de llaves ssh en el terminal mediante el siguiente comando:
ssh-keygen -t rsa
Copia esta llave del sistema remoto usando:
ssh-copy-id user@remote_machine
Una vez que te hayas autenticado en la(s) máquina(s) remota(s), la llave pública se copiará y estarás listo para iniciar las transferencias.
Si no recuerdas la(s) contraseña(s) de root para cada sistema, puedes hacer que el cliente ssh seleccione el archivo desde el cual se lee automáticamente la llave de identidad privada para la confirmación de RSA.
Para la versión 2 del protocolo, la ruta de identidad predeterminada de la llave del host es ~/.ssh/id_dsa, mientras que para la versión 1 del protocolo es ~/.ssh/id_rsa. Luego, debes averiguar dónde está almacenada la copia de seguridad de las llaves privada y pública para poder emplear el comando ssh para usarlas automáticamente.
Para la ruta /back-up/home/jack/.ssh, el comando es el siguiente:
ssh -i /back-up/home/user/.ssh/id_dsa user@yourserver.servername.domain
Consejo profesional
Esta opción tiene el valor predeterminado –overwrite [yes], así que, a menos que especifiques la opción –overwrite no o –overwrite ask en el comando scp, la operación sobrescribirá los archivos que tienen nombres y ubicaciones idénticos sin ninguna advertencia.
Si estás transfiriendo archivos grandes, te recomendamos utilizar una sesión tmux o que ejecutes el comando dentro de una pantalla diferente. Además, también debes usar la opción –v para transferencias grandes. Esto forzará a scp a mostrar cualquier conexión de depuración, autenticación o problemas de configuración.
Copiando archivos con el comando SCP
La mejor parte de SCP en Linux es que te da la posibilidad de transferir archivos entre dos hosts o entre un host y una máquina local. Veamos cómo se debería usar el comando para cada tipo de transferencia.
Archivo local a una ubicación remota
Copiaremos un archivo local scp.zip, al usuario de la máquina remota llamado root. El nombre de usuario es seguido por la dirección IP del servidor.
Ejemplo:
scp /users/Edward/desktop/scp.zip root@191.162.0.2:/writing/article
Si no tienes configurada una confirmación automática de cliente ssh, se te solicitará que ingreses la contraseña del usuario de la máquina remota y verás un medidor de progreso. Se vería algo como esto:
root@191.162.0.2’s password: novel3.zip 100% 0 0.0KB/s 00:00
Pero digamos que la máquina remota está configurada para escuchar las conexiones SSH en un puerto que no sea el predeterminado 22. En este caso, debes especificar ese puerto usando una opción.
scp -P 2322 /users/Edward/desktop/scp.zip root@191.162.0.2:/writing/article
Si también quieres cambiar el nombre del archivo durante la operación de transferencia, tu comando tendrá este aspecto (si tu puerto no es el predeterminado, simplemente agrega –P y el número de puerto):
scp /users/Edward/desktop/scp.zip root@191.162.0.2:/writing/article/howtoscp.zip
Si quieres copiar un directorio que tiene más archivos y/o subdirectorios, usa el comando -r que describimos anteriormente
scp -r /users/Edward/desktop root@191.162.0.2:/writing/article
Archivo remoto a máquina local
En este proceso, el origen y el destino del comando se invierten, por lo que esto debe reflejarse en la sintaxis. Esta vez, estamos intentando copiar scp.zip desde el mismo host remoto a nuestra máquina local:
scp root@191.162.0.2:/writing/articles/SCP.zip Users/Edward/Desktop
Nuevamente, esto debería solicitar la misma salida de inicio de sesión SSH en la que debes ingresar la contraseña, a menos que la autenticación esté deshabilitada por los privilegios de sudo, o si forzaste al cliente ssh a usar una llave privada en tu máquina.
Archivo remoto a otra ubicación remota
Para copiar archivos de un host remoto a otro, deberás ingresar las contraseñas de ambas cuentas después de ejecutar este comando en tu terminal.
Ejemplo:
scp root@191.162.0.2:/writing/article/scp.zip edward@11.10.0.1:/publishing
El comando anterior copia el archivo fuente /writing/article/scp.zip desde el primer host al segundo. Para copiar carpetas, simplemente agrega la opción –r y especifica la ruta de la carpeta en lugar del archivo dentro de ella, como hicimos antes.
En circunstancias normales, el archivo va directamente del primer host remoto al segundo. Sin embargo, si quieres redireccionar la operación a través de tu máquina, puedes agregar la opción -3:
scp -3 root@191.162.0.2:/writing/article/scp.zip edward@11.10.0.1:/publishing
¡Eso es todo!
Conclusión
En este artículo hemos aprendido cómo transferir fácilmente archivos entre hosts remotos y locales con el comando SCP de Linux. Esto es extremadamente útil cuando trabajas con múltiples servidores. El protocolo de copia segura (SCP – Secure Copy Protocol) hace que sea más fácil copiar con éxito información de un host remoto a otro sin tener que iniciar sesión.
Además, este método de transferencia remota de archivos cifra tus datos con secure shell (SSH), lo que garantizará la confidencialidad de la información que se transmita.
Comentarios
February 22 2020
Gracias Gustavo x muy buena explicacion. Si necesitas mi ayuda en otros temas estoy en FB - Yurec Luthier. Un saludo
April 21 2020
Si existe ya un archivo con el mismo nombre en el directorio donde estas copiandolo se sobreescribe?
April 23 2020
Hola En la opción: –c permitirá la compresión de los datos mientras se lleva a cabo la operación de transferencia. La C es mayúscula El post está perfecto! :)
April 23 2020
Soy el pesao de antes. la opcióon -u no funciona, tampoco aparece en el man.
November 01 2022
Hola! como hago para incluir la contraseña del servidor remoto para no tener que ingresarla manualmente en caso de una tarea programada, por ejemplo.
November 04 2022
Hola Omar! Si lo que quieres es utilizar tu conexión SSH sin necesidad de ingresar la contraseña, puedes guiarte con este tutorial. Saludos!