Logo OpenSSH

Copiar archivos y carpetas con SCP (Secure Copy Protocol)

 
 

Índice General

  1. ¿Qué es y para qué sirve SCP?
  2. Instalación del paquete openssh-client
  3. Sintáxis del comando
  4. Ejemplos de sintaxis para scp
  5. Opciones de funcionamiento

Enlaces externos
 

  1. ¿Qué es y para qué sirve SCP? (Volver al índice General)
    SCP o Secure Copy Protocol permite la transferencia segura de archivos entre un host local y otro remoto o entre dos hosts remotos, usando el protocolo Secure Shell (SSH).

    El término SCP puede referirse a cualquiera de los dos conceptos siguientes: el protocolo SCP o el programa SCP.

    En este artículo aprenderemos a instalar el paquete openssh-client, necesario para trabajar el cliente SCP del proyecto OpenSSH y presentarmos simples ejemplos de como transferir archivos con el cliente SCP.

    El paquete openssh-client proporciona los clientes de ssh, scp y sftp, los programas ssh-agent y ssh-add para hacer más comoda la autenticación de clave pública, y las utilidades ssh-keygen, ssh-keyscan, ssh-copy-id y ssh-argv0.

  2.  

  3. Instalación del paquete openssh-client (Volver al índice General)
    Antes de comenzar la instalación actualizamos los repositorios con la siguiente orden:

    $ sudo apt-get update

    A continuación procedemos a la instalación del paquete openssh-client.

    $ sudo apt-get install openssh-client
  4.  

  5. Sintáxis del comando (Volver al índice General)
    La sintáxis del comando es la siguiente:

    scp [-12346BCEpqrv] [-c cipher] [-F ssh_config] [-i identity_file] [-l limit]
        [-o ssh_option] [-P port] [-S program] [[user@]host1:]file1 ... [[user@]host2:]file2

    Explicar la sintáxis completa y cada una de las opciones del comando scp esta fuera del alcance de este artículo. No obstante, para obtener más ayuda puedes ejecutar la siguiente orden:

    $ man scp

    o acceder a la Página del Manual de SCP en línea.

    La sintaxis básica es esta:

    $ scp [[usuario@]host_origen:]file1 ... [[usuario@]host_destino:]file2
    • scp -> Es el comando en sí, copia uno más archivos por medio de una conexión segura.
    •  

    • [[usuario@]host_origen:]file1 -> Indica el origen de donde el archivo o los archivos serán copiados. Puede o no contener la información del ordenador remoto y también, puede contener la información del usuario que es dueño del archivo o archivos en el ordenador remoto. Si el usuario no esta especificado, entonces por defecto usará la cuenta usuario actual en el ordenador donde se ejecuta el comando. Y si ningún ordenador remoto es especificado, entonces buscará el archivo localmente.
    •  

    • [[usuario@]host_destino:]file2 -> Indica el destino a donde el archivo o los archivos serán copiados. Puede o no contener la información del ordenador remoto, y también puede contener la información del usuario que es dueño del archivo o archivos en el ordenador remoto. Si el usuario no esta especificado, entonces por defecto usará la cuenta usuario actual en el ordenador donde se ejecuta el comando. Y si ningún ordenador remoto es especificado, entonces buscará el archivo localmente.

     
    NOTA ACLARATIVA: Se puede no especificar ni host ni usuario tanto en el origen como en el destino, y en este caso el comando scp actuará como el comando cp y copiará los archivos localmente.
     
    CONSIDERACIONES DE SEGURIDAD: Para copiar archivos o directorios entre sistemas, debe tener permiso para iniciar sesión y copiar archivos. El comando scp, como componente del comando ssh, requiere que tenga una cuenta de usuario o acceso a claves de host en el sistema remoto. Véase autenticar con clave pública.
     
    ESPECIFICACIÓN DEL ORIGEN Y EL DESTINO PARA OPERACIONES DE COPIA: Con el comando scp, puede especificar el origen (el archivo o el directorio que se copiará) y el destino (la ubicación en la que se copiará el archivo o el directorio). Puede acortar las cadenas de ruta con el carácter de tilde (~) y los caracteres comodín de shell (*, ?, {}, etc).
     
    El carácter de tilde (~) se expande en todos los programas de shell en el directorio raíz del usuario actual. El usuario actual es el usuario con el que se ejecuta el shell. Si el directorio raíz del usuario mortadelo es /home/mortadelo, entonces para el usuario mortadelo, ~/archivo.txt se expande a /home/mortadelo/archivo.txt.
     
    Esta expansión también funciona para las rutas remotas. Si el usuario mortadelo desea copiar un archivo de su directorio raíz, estas tres descripciones de rutas son equivalentes:

    • host_remoto:/home/mortadelo/archivo.txt
    • host_remoto:~/archivo.txt
    • host_remoto:archivo.txt


     
     
    Esta expansión también resulta útil al hacer referencia al directorio raíz remoto de otro usuario. En este caso, debe incluirse el nombre del usuario después del carácter de tilde (~). Para el usuario mortadelo, host_remoto:~mortadelo/archivo.txt es equivalente a host_remoto:/home/mortadelo/archivo.txt, pero es más corto para escribir.

  6.  

  7. Ejemplos de sintaxis para scp (Volver al índice General)

    NOTA: En este artículo se da por hecho que existe un servidor SSH en la red, si no es así puedes ver el artículo Instalar y configurar el servicio SSH en Debian para aprender como instalarlo.

    • Copiar archivo desde el host remoto al host local (Volver al índice General)
      Copiar el archivo foobar.txt ubicado en un directorio del equipo remoto a un directorio ubicado en el equipo local:

      $ scp usuario_remoto@host_remoto:/algun_directorio_remoto/foobar.txt /algun_directorio_local
    • Copiar archivo desde el host local al host remoto (Volver al índice General)
      Copiar el archivo foobar.txt ubicado en un directorio del equipo local a un directorio ubicado en el equipo remoto:

      $ scp /algun_directorio_local/foobar.txt usuario_remoto@host_remoto:/algun_directorio_remoto
    • Copiar directorio y todo su contenido desde el host remoto al host local (Volver al índice General)
      Copiar todo el contenido del directorio foo ubicado en el equipo remoto al directorio bar ubicado en el equipo local:

      $ scp -r usuario_remoto@host_remoto:/algun_directorio_remoto/foo /algun_directorio_local/bar

      Copiar todo el contenido del directorio foo ubicado en el equipo remoto al directorio actual. El «.» indica el directorio donde se está ejecutando el comando en el equipo local:

      $ scp -r usuario_remoto@host_remoto:/algun_directorio_remoto/foo .

      El parámetro «-r» significa recursivo, es decir, copia la carpeta y todo su contenido, incluidas las subcarpetas y el contenido de éstas. Si no lo ponemos, la orden para copiar sólo los archivos de una carpeta sería:

      $ scp usuario_remoto@host_remoto:/algun_directorio_remoto/foo/* .
    • Copiar directorio desde el host local al host remoto (Volver al índice General)
      Copiar todo el contenido del directorio foo ubicado en el equipo local al directorio bar ubicado en el equipo remoto:

      $ scp -r /algun_directorio_local/foo usuario_remoto@host_remoto:/algun_directorio_remoto/bar

      La orden para copiar sólo los archivos de una carpeta sería:

      $ scp /algun_directorio_local/foo/* usuario_remoto@host_remoto:/algun_directorio_remoto/bar
    • Copiar archivo desde un host remoto a otro host remoto (Volver al índice General)
      Supongamos que queremos copiar archivos entre dos equipos remotos. Desde nuestro equipo local podemos ejecutar la orden de que se copien archivos de un equipo remoto a otro equipo remoto.

      $ scp usuario_remoto@host_remoto1:/algun_directorio_remoto/foobar.txt usuario_remoto@host_remoto2:/algun_directorio_remoto/

      Un ejemplo más descriptivo:

      $ scp mortadelo@host1.example.com:/home/mortadelo/archivo.txt filemon@host2.example.com:/home/filemon/
    • Copiar archivo de un host remoto al mismo host remoto pero en otro directorio (Volver al índice General)
      $ scp mortadelo@host1.example.com:/home/mortadelo/archivo.txt filemon@host1.example.com:/home/filemon/
    • Copiar múltiples archivos (Volver al índice General)
      Solo tendremos que ponerlos en una lista separada por espacios:

      $ scp archivo1 archivo2 archivo3 usuario_remoto@servidor_remoto:/algun_directorio_remoto/

      Si los archivos están en diferentes directorios, habrá que especificar la ruta completa.

      $ scp /ruta/archivo1 /ruta/archivo2 /ruta/archivo3 usuario_remoto@servidor_remoto:/algun_directorio_remoto/
  8.  

  9. Opciones de funcionamiento (Volver al índice General)
    • Copiando por un puerto distinto al estándard 22/TCP (Volver al índice General)
      Con el parámetro -P puerto le indicamos a scp que conecte con el servidor remoto por un puerto distinto al 22/TCP. En ese ejemplo le indicamos que se conecte por el puerto 2264/TCP:

      $ scp -P 2264 foobar.txt usuario_remoto@servidor_remoto:/algun_directorio_remoto
    • Utilizar otro algoritmo de cifrado en la conexión (Volver al índice General)
      Por defecto scp usa Triple-DES para cifrar los datos a enviar. Utilizando el algoritmo de cifrado Blowfish aumentamos la velocidad. Para hacerlo, añadimos el parámetro -c blowfish a la línea de comandos:

      $ scp -c blowfish foobar.txt usuario_remoto@servidor_remoto:/algun_directorio_remoto

      Pero si lo que más importa es la seguridad, podemos incrementarla a costa sacrificar algo de velocidad utilizando el algoritmo de cifrad Triple-DES:

      $ scp -c 3des foobar.txt usuario_remoto@servidor_remoto:/algun_directorio_remoto
    • Comprimir los datos en la conexión (Volver al índice General)
      A menudo se sugiere utilizar el parámetro -C, que comprime los datos a enviar, para aumentar la velocidad. El efecto de la compresión sólo aumentará significativamente la velocidad de la conexión si esta es muy lenta. De lo contrario, sólo será una carga adicional para la CPU.

      $ scp -c blowfish -C foobar.txt usuario_remoto@servidor_remoto:/algun_directorio_remoto
    • Limitar el ancho de banda (Volver al índice General)
      Con el parámetro -l limit le indicamos a scp el límite en Kbits/s. Si queremos limitar el ancho de banda a 75Kbps ejecutaremos la siguiente orden:

      $ scp -l75 foobar.txt usuario_remoto@servidor_remoto:/algun_directorio_remoto
    • Definir el uso de IPv4 o IPv6 (Volver al índice General)
      Para forzar el uso de IPv4:

      $ scp -4 foobar.txt usuario_remoto@servidor_remoto:/algun_directorio_remoto

      Para forzar el uso de IPv6:

      $ scp -6 foobar.txt usuario_remoto@servidor_remoto:/algun_directorio_remoto
    • Modo verbose (Volver al índice General)
      Para obtener más información de salida del comando podemos usar el parámetro -v

      $ scp -v foobar.txt usuario_remoto@servidor_remoto:/algun_directorio_remoto

 
Enlaces externos (Volver al índice General)

 

Espero que este artículo os haya sido de utilidad. Si pensáis que podéis colaborar para mejorar este artículo, que hay algo erróneo en él o simplemente deseáis comentarlo, por favor, dejad vuestra opinión más abajo.
 
Seguir J. Carlos:

Técnico Informático - Desarrollo Web - Administración de Redes

Técnico Informático. Desarrollo Web. Administración de redes.

Últimas publicaciones de

Deja una respuesta

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

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.