Uso de SCP para copiar y transferir archivos y carpetas de forma segura

Aprenda SCP (Protocolo de copia segura): una herramienta de línea de comandos basada en SSH que se usa para transferir archivos entre computadoras locales y remotas, a través de ejemplos.

Introducción

SCP significa Protocolo de copia segura. Es una herramienta que se puede utilizar para transferir archivos de un host local a un host remoto, de un host remoto a un host local o entre dos hosts remotos. En este artículo, examinaremos cómo usar SCP para copiar entre hosts locales y remotos.

SCP se ejecuta casi exclusivamente desde la línea de comandos usando el comando scp. Utiliza ssh (Secure Shell) para transferir datos hacia y desde hosts remotos. Como tal, tiene un conjunto de opciones que especifican los parámetros de autenticación, hosts y puertos como SSH.

De forma predeterminada, el protocolo SCP opera en el puerto “22” a menos que se anule mediante una opción de línea de comandos. Todos los comandos scp siguen la forma:

1
$ scp [OPTIONS] [SOURCE] [DESTINATION]

Veamos cómo SCP nos permite transferir un archivo en nuestra computadora local a una remota.

Transferir un archivo local a un destino remoto {#transferir un archivo local a un destino remoto}

Cargar un archivo desde nuestra computadora local a una ubicación remota es un escenario común para los profesionales de TI. Con scp, podemos lograr esto con un comando como:

1
$ scp path/to/local/file.ext [correo electrónico protegido]:path/to/remote/file.ext

Este comando copiará el archivo local file.ext a la ruta especificada (después de los dos puntos) en remote-host.

  • El usuario proporcionado en el comando es el nombre de usuario. El nombre de usuario tiene que pertenecer a un usuario de la máquina remota.
  • El remote-host proporcionado es el nombre de dominio o la dirección IP de la máquina remota a la que intentamos conectarnos.
  • Luego especificamos dónde queremos copiar el archivo en la máquina remota después de los dos puntos (:).

Después de ejecutar este comando, aparecerá un mensaje para la contraseña correspondiente a la cuenta de usuario del host remoto:

1
$ [correo electrónico protegido]'s password:

Una vez ingresada la contraseña, se copiará el archivo.

Esta cuenta de usuario debe tener acceso a la ruta remota especificada en el comando. Si no puede usar sus credenciales para iniciar sesión de forma remota con ssh, esas credenciales no funcionarán cuando use scp.

Ahora que sabemos cómo transferir un archivo remoto a nuestra máquina local, analicemos el escenario inverso: transferir un archivo desde un host remoto al host local.

Transferencia de un archivo remoto a un destino local

De manera muy similar, podemos copiar un archivo desde una computadora remota a nuestra máquina local:

1
$ scp [correo electrónico protegido]:path/to/remote/file.ext path/to/local/file.ext

Esto funciona esencialmente de la misma manera, excepto que el usuario remoto, el host y la ruta ahora se especifican antes que la ruta local.

Todavía se mostrará un mensaje para la contraseña que pertenece a la cuenta de usuario del host remoto. Pero, cuando termine, debería tener un nuevo archivo en la carpeta que especificó.

Echemos un vistazo a la transferencia de un archivo entre dos hosts remotos.

Transferencia de un archivo remoto a un destino remoto

Finalmente, el siguiente formato de comando se usa para transferir un archivo entre dos hosts remotos:

1
$ scp [correo electrónico protegido]:path/to/remote/file.ext [correo electrónico protegido]:path/to/remote/file.ext

Tenga en cuenta que, en este caso, se deben especificar dos usuarios remotos. Cada uno tiene que tener acceso a su servidor remoto respectivo. Se presentará una solicitud de contraseña para aceptar las credenciales de inicio de sesión para cada usuario.

De todas estas variaciones de la copia de archivos, vemos que el comando scp es flexible en lo que puede ser la ruta de origen o de destino. Esta versatilidad lo hace muy útil para scripts.

Podemos transferir archivos entre nuestras máquinas locales y remotas para probar y actualizar las configuraciones del servidor o la aplicación. Podemos transferir archivos entre nuestro host remoto principal y un servidor de respaldo con scp. La simplicidad y flexibilidad de SCP lo ha hecho popular entre los administradores de sistemas.

El comando SCP también tiene configuraciones para una mayor flexibilidad en qué y cómo copiamos. Veamos cómo podemos usar las opciones de la línea de comandos para modificar su comportamiento.

Opciones comunes de la línea de comandos de SCP

El comando scp tiene algunas opciones útiles (también conocidas como banderas) que pueden alterar aspectos de cómo se conecta a un host remoto.

Cambiando el Puerto

Como se mencionó anteriormente, SCP opera en el puerto ‘22’ de forma predeterminada. Sin embargo, esto se puede anular proporcionando el indicador -P, seguido del número de puerto.

Así es como copiamos un archivo a un destino remoto que se conecta al puerto 44 en lugar de 22:

1
$ scp -P 44 path/to/local/file.ext [correo electrónico protegido]:path/to/remote/file.ext

Tiempo de modificación/acceso

Vale la pena señalar la diferencia entre el indicador -P y -p. El indicador -p conserva los tiempos de modificación del archivo, los tiempos de acceso y los modos durante la transferencia. Esto puede ser útil si se desea mantener las propiedades del archivo sin cambios:

1
$ scp -p path/to/local/file.ext [correo electrónico protegido]:path/to/remote/file.ext

Copiando directorios

El indicador -r se puede usar para copiar recursivamente una carpeta y su contenido en lugar de un solo archivo:

1
$ scp -r path/to/local/folder [correo electrónico protegido]:path/to/remote/folder

Esto es más limpio que copiar archivos de la carpeta usando los comodines * o ?.

Modo Suprimido

El indicador -q suprime el medidor de progreso y los mensajes que no son de error para que su terminal se mantenga limpio:

1
2
3
4
5
$ scp path/to/local/file.ext [correo electrónico protegido]:path/to/remote/file.ext
file.ext                                100%    0     0.0KB/s   00:00

$ scp -q path/to/local/file.ext [correo electrónico protegido]:path/to/remote/file.ext
$

Tenga en cuenta que en el segundo comando que ejecutamos en este ejemplo, el porcentaje de transferencia no se muestra debido al indicador -q.

Archivo de par de claves de autenticación

El indicador -i se puede usar para autenticar la conexión usando un par de claves criptográficas almacenadas en un archivo en lugar de un nombre de usuario y una contraseña. Esta es una práctica común para la autenticación en servidores remotos en la nube, como los de AWS o Digital Ocean.

Puede especificar un archivo de par de claves como este:

1
$ scp -i path/to/local/keypair.pem path/to/local/file.ext [correo electrónico protegido]:path/to/remote/file.ext

Usar varias opciones de SCP

Las banderas también se pueden usar juntas. Aquí hay un ejemplo que implementa varios indicadores para copiar una carpeta desde un host remoto a nuestra máquina local utilizando un archivo de par de claves para la autenticación en el puerto ‘44’, al tiempo que conserva las propiedades del archivo y suprime la salida:

1
$ scp -p -q -P 44 -i path/to/local/keypair.pem -r path/to/local/folder [correo electrónico protegido]:path/to/remote/folder

Con esta base, ¡estás equipado para usar SCP en una variedad de situaciones!

Conclusión

En este artículo, discutimos SCP, un protocolo que se puede usar para transferir archivos convenientemente entre hosts. Cubrimos la transferencia de archivos del host local a un host remoto, de un host remoto a un host local y entre dos hosts remotos.

También mencionamos algunas opciones importantes de la línea de comandos que se pueden usar en escenarios específicos.

Sobre el autor

Este artículo fue escrito por Jacob Stopak, un desarrollador de software y consultor apasionado por ayudar a otros a mejorar sus vidas a través del código. Jacob es el autor de la Guía básica de codificación para desarrolladores, un libro introductorio que cubre conceptos y herramientas de codificación esenciales. Contiene capítulos sobre arquitectura informática básica, Internet, línea de comandos, HTML, CSS, JavaScript, Python, Java, bases de datos/SQL, Git y más.