Comando SCP de Linux
SCP es la herramienta clásica de Linux y los sistemas operativos compatibles con POSIX que permite copiar archivos cifrados entre sistemas dentro de una misma red. La abreviatura SCP significa Secure Copy (copia segura) donde Secure (seguro) hace referencia al cifrado utilizado para la transferencia de datos. El nombre del protocolo SCP deriva de las dos tecnologías mencionadas a continuación:
- el protocolo SSH (Secure Shell), que permite el acceso cifrado a los sistemas remotos;
- la herramienta RCP (Remote Copy), que copia archivos de forma insegura, es decir, sin cifrar, en la red.
EL comando SCP es un software que se ejecuta en el sistema local y en el servidor. Actúa como daemon y como cliente del protocolo SCP. Dado que SCP forma parte de la ampliamente utilizada distribución OpenSSH, está disponible en prácticamente todos los sistemas. Como es habitual en Linux, el comando SCP se introduce en la línea de comandos.
Uno de los mayores inconvenientes del protocolo SCP es que el software ha crecido de forma orgánica. No está estandarizado ni consta de un documento RFC que lo describa ni nada similar. En cambio, solo tiene, como parte del proyecto OpenSSH, una referencia de implementación. Hoy en día existen alternativas más modernas a SCP que se suelen usar para la mayoría de los casos.
Funcionalidad y uso del comando SCP de Linux
La funcionalidad del comando SCP es análoga a la del antiguo comando RCP. Al igual que con RCP, la sintaxis del comando SCP en la línea de comandos sigue la del comando CP, el cual se utiliza para copiar archivos en el sistema local. Dado que SCP se basa en el protocolo SSH, se comunica con la red a través del puerto TCP 22. A continuación tienes un resumen de los comandos para copiar archivos más comunes de Linux:
Comando de copia | Nombre | Funcionalidad | Acceso remoto |
cp | Copy | Copia, solo local | - |
rcp | Remote Copy | Copia local-remota, remota-remota | RSH |
scp | Secure Copy | Copia segura local-remota, remota-remota | SSH |
sftp | Secure File Transfer Protocol | Copia segura local- remota, remota- remota; manipulación de sistemas de archivos remotos | SSH |
rsync | Remote Sync | Copia segura local, local-remota, remota- remota; sincronización | SSH, Stunnel |
El comando SCP permite tanto copiar un archivo a un servidor como descargarlo de él. El protocolo solo permite el flujo de datos en sentido unidireccional, lo que significa que por cada conexión solo se puede copiar en un sentido. Adicionalmente, con SCP se pueden copiar archivos entre dos sistemas de la misma red. El comando SCP ofrece la opción de que, al realizar la copia, también se transfieran los atributos del archivo de origen al del destino.
Flujo de datos al copiar entre dos sistemas remotos
Si quieres copiar un archivo entre dos sistemas remotos empleando el comando SCP de Linux, hay algunos detalles que debes de tener en cuenta. SCP utiliza el protocolo SSH para establecer conexiones cifradas. El acceso a un sistema remoto con SSH se hace mediante usuario y contraseña o con una clave SSH (par de claves pública/privada). Por lo general, el método privado es preferible al público.
En la variante original, en la que se utiliza SCP para transferir un archivo de un sistema remoto (host) a otro host, se sigue este proceso:
- El usuario ordena a la herramienta SCP de su sistema local que transfiera un archivo ubicado en el host 1 al host 2.
- El programa SCP en el sistema local del usuario abre una conexión SSH con el host 1 y ejecuta el programa SCP ubicado allí.
- El programa SCP en el host 1 abre una conexión SSH con el host 2 y transfiere el archivo guardado en el host 1 al host 2 como si fuera un archivo local.
Para que funcione este proceso, se necesita que llegue una clave SSH pública al host 2 por parte del host 1. Sin embargo, en este caso, el host 1 tiene un acceso permanente al host 2 sin que el usuario haga nada, esto supone un riesgo a la seguridad. Por lo que existe una variante más moderna:
- El usuario ordena a la herramienta SCP de su sistema local que transfiera un archivo ubicado en el host 1 al host 2.
- El programa SCP en el sistema local del usuario abre una conexión SSH con el host 1 y el host 2 simultáneamente.
- El archivo se dirige desde el host 1 a través del sistema local y se transfiere al host 2.
En este caso, las claves SSH públicas del usuario deben almacenarse tanto en el host 1 como en el host 2. De todos modos, este ya debería ser el caso en la mayoría de los casos como, por ejemplo, cuando el usuario es un administrador, que tiene acceso a ambos hosts.
Sintaxis del comando SCP de Linux
La sintaxis de un comando define cómo debe de introducirse en la línea de comandos para que se ejecute correctamente. Aquí te mostramos de manera esquemática cómo es la sintaxis del comando SCP. El formato básico para usar el comando SCP se basa en la sintaxis del comando CP, que se utiliza para copiar archivos en el sistema local: el archivo en la ruta de origen se copia en la ruta de destino. Hay varios parámetros que puedes ponerle a la ruta de origen según tus necesidades:
scp <parámetro> <ruta de origen> <ruta de destino>
Para copiar archivos a, desde o entre sistemas remotos, la ruta de origen o de destino, o ambas, se sustituyen por una especificación de ruta más compleja. Dicha especificación de ruta contiene el nombre de la red con la dirección de IP del host y el nombre de usuario que quiere acceder al host:
<usuario>@<host>:<directorio/archivo.extensión>
A continuación, representaremos el término ‘<usuario>@<host>’ como ‘usuario@example.com’ (para el host 1) al igual que ‘usuario@www.example.com’ (para el host 2).
Opciones del comando SCP de Linux
El funcionamiento del comando SCP se controla mediante varios parámetros, como es habitual con las herramientas de línea de comandos. Aquí tienes una selección de los parámetros más útiles:
Option | Bedeutung | Kommentar |
-C | Usar la compresión (compression) | No confundir con el parámetro ‘-c’ (cipher), que activa el procedimiento de cifrado |
-p | Transferir los atributos de archivo al archivo de destino (permissions) | No confundir con el parámetro ‘-P’, que activa el puerto de red |
-r | Copiar los directorios de manera iterativa (recursive) | - |
-v | Mostrar la versión ampliada (verbose) | - |
-q | Eliminar la salida (quiet) | - |
-3 | Enviar los datos a través del sistema local (third party) | - |
Para una descripción detallada de todos los parámetros disponibles, entra en la página manual del comando SCP.
Ejemplos de uso del comando SCP de Linux
El comando SCP se puede utilizar de muchas maneras y se puede combinar con los patrones habituales de la línea de comandos para especificar archivos y directorios. Dada la amplitud de los posibles escenarios de uso, aquí solo presentamos algunos casos típicos. Ten en cuenta que hoy en día se prefieren otras herramientas distintas al comando SCP para copiar archivos en la red.
Copiar un archivo del sistema local al remoto
Para copiar un archivo ‘archivo.txt’ desde el directorio actual del sistema local al host ‘example.com’, utilizamos la siguiente llamada SCP. Ten en cuenta que aquí simulamos que, siendo el usuario llamado ‘usuario’, tenemos acceso al host ‘example.com’.
scp archivo.txt usuario@example.com:/ruta/al/directorio
Una vez hemos realizado la copia con éxito, el archivo ‘archivo.txt’ se encuentra en el directorio ‘/ruta/al/archivo del host’.
Copiar un archivo del sistema remoto al local
Para invertir el sentido de la operación de copia, basta con intercambiar las rutas local y remota. En el primer ejemplo, utilizamos el punto ‘.’ para definir el directorio actual como destino:
scp usuario@example.com:/ruta/al/directorio/archivo.txt .
Aquí mostramos una variante del primer ejemplo donde copiamos el archivo a la carpeta ‘Desktop’ del ordenador del usuario, simbolizada por la virgulilla ‘~’. Ten en cuenta que utilizar la virgulilla indica que está en la carpeta local del usuario. Para evitar errores, una ruta con virgulilla debe ir entre comillas:
scp usuario@example.com:/ruta/al/directorio/archivo.txt "~/Desktop/"
Si quieres copiar el archivo y guardarlo con otro nombre, especifica el nuevo nombre al final de la ruta de destino:
scp usuario@example.com:/ruta/al/directorio/archivo.txt "~/Desktop/archivo.bak"
Copiar varios archivos
Si estás familiarizado con el uso del comando CP, puede que ya sospeches que también podemos copiar varios archivos con el comando SCP. La forma más fácil de hacerlo es enumerar los archivos uno por uno. En el siguiente ejemplo, todos los archivos seleccionados se encuentran en el directorio actual, por lo que nos ahorramos tener que introducir la ruta de cada uno de los archivos:
scp archivo-1.txt archivo-2.txt usuario@example.com:/ruta/al/directorio
Ten cuidado al utilizar “wildcards” y “globs” como ‘?’ y ‘*’. Aunque son cómodos, porque permiten introducir los nombres de archivos de forma más compacta, pueden llevar a errores inesperados cuando se usan en la ruta del host. En estos casos, es mejor utilizar un bucle, como te mostramos en el ejemplo “Transferir archivos a un sistema remoto”, o recurrir a una herramienta alternativa.
Copiar un directorio completo
Como es habitual con el comando CP, se puede copiar un directorio entero de forma iterativa. Para ello, introducimos el parámetro ‘-r’ antes de la ruta de origen.
scp -r directorio de usuario@example.com:/ruta/al/directorio
Después de que se produzca la copia con éxito, todos los archivos y subdirectorios ubicados en el directorio ‘directorio’ tendrán una copia exacta en el host bajo la ruta ‘/ruta/al/directorio’.
Para transferir archivos de mayor peso, conviene introducir el parámetro “-C”, que comprime los archivos para transferirlos:
scp -C -r directorio usuario@example.com:/ruta/al/directorio
Ten en cuenta que SCP siempre transfiere todos los archivos de manera íntegra. Si la transferencia se interrumpe, hay que volver a empezar. Para copiar directorios de mayor peso o si tienes una conexión de inestable, es mejor utilizar otra herramienta diferente.
Copiar un archivo entre dos sistemas remotos
Para copiar un archivo entre dos hosts, utilizamos el comando SCP sin indicar una ruta de acceso local. Las rutas de origen y destino deben contener los datos del usuario y del host:
scp usuario@example.com:/ruta/al/otro/directorio/archivo.txt usuario@www.example.com:/ruta/al/otro/directorio/archivo
Como mencionamos al principio, a menudo conviene realizar la transferencia a través de tu propio sistema. Para ello, utilizamos el parámetro “-3”, que se pone delante de la ruta de origen:
scp -3 usuario@example.com:/ruta/al/directorio/archivo.txt usuario@www.example.com:/ruta/al/directorio/archivo
Transferir archivos a un sistema remoto
Usar el comando SCP para transferir archivos locales a un host es un poco más complejo. Esto puede ser necesario, por ejemplo, para crear una copia de seguridad remota de archivos que ya no se necesiten localmente. A diferencia de la distinción que se hace entre los comandos locales ‘cp’ (“copy”, copiar) y ‘mv’ (“move”, mover), el comando SCP no ofrece un parámetro independiente para mover un archivo. Sin embargo, podemos hacerlo nosotros mismos con métodos convencionales.
En primer lugar, veamos la operación de transferencia, se compone de una operación de copia seguida de una operación de borrado. Implementamos esta secuencia de operaciones en la línea de comandos combinando los comandos ‘scp’ y ‘rm’, este último utilizado para borrar un archivo. Concatenamos los comandos con el operador lógico AND ‘&&’, de modo que el segundo comando se ejecuta solo si el primero tiene éxito. Así, nos aseguramos de que la copia en el host se ha creado antes de que se elimine la versión original en local.
Por último, utilizamos un bucle ‘for’ para procesar todos los archivos que se encuentran en el directorio actual. También tenemos la opción de introducir un parámetro para incluir solo ciertos archivos o tipos de archivos. Como queremos crear una copia de seguridad exacta de cada archivo, utilizamos el parámetro ‘-p’ para copiar también los atributos de cada archivo. Dado que crear una copia de seguridad es un proceso sensible, introducimos también el parámetro ‘-v’ que hace que el comando SCP muestre información adicional sobre el estado de la copia de seguridad.
for archivo in ./patrón*.extensión ; do scp -p -v "$archivo" usuario@example.com:"/backup/${archivo}. bak" && rm "$archivo" ; done
Alternativas al comando SCP de Linux
Aunque SCP esté disponible en casi todos los sistemas, hace tiempo que dejó de ser el método preferido para copiar archivos en la red. Lo dicen incluso los desarrolladores del proyecto SSH, que su proyecto incluye la herramienta SCP.
Los desarrolladores de SCP ofrecen algunas alternativas como SFTP (Secure File Transfer Protocol) y Rsync (Remote Sync) que también utilizan SSH para el acceso cifrado al host remoto. Ambos programas ofrecen mayores prestaciones y están en continuo desarrollo. El único inconveniente importante de estas herramientas es que es necesario instalarlas primero, mientras que SCP viene preinstalado en casi todos los sistemas. Veamos con más detalle las dos alternativas.
SFTP es más o menos el sucesor directo de SCP. La transferencia de datos está protegida por el cifrado y utiliza la infraestructura SSH existente. En la práctica, esto significa que SFTP puede utilizarse para acceder desde el sistema local a los sistemas de archivos remotos de los hosts para los que el sistema local tenga acceso SSH. El protocolo SFTP proporciona mejores prestaciones que las del protocolo SCP. SFTP comprueba automáticamente que los datos transferidos son correctos y también permite retomar las transferencias interrumpidas.
Rsync es otra potente herramienta capaz de realizar las mismas tareas que SCP. Sin embargo, Rsync no es un comando de copia como tal. La herramienta puede hacer mucho más y está especialmente diseñada para la transferencia eficiente de grandes archivos y cantidades de datos. Para ello, Rsync compara los archivos de la ruta de destino con los de la ruta de origen y transfiere únicamente la diferencia. No es necesario empezar desde el principio si se interrumpe una transferencia, aunque se reinicie el sistema.
Si dispones de las herramientas SFTP o Rsync, deberías usarlas para copiar archivos en la red antes de recurrir a la herramienta SCP.