Comando SCP: ejemplos de uso

Todos utilizamos de forma asidua el comando scp (Secure Copy) en Linux y Unix para transferir archivos entre hosts a través del protocolo SSH. Normalmente nos ceñimos a su utilización básica pero viene bien conocer algunos trucos o usos poco habituales del comando (para algunos) para mejorar u optimizar su utilización. Ahí van unos cuantos ejemplos que espero os sean de utilidad.

Uso básico de SCP

Comencemos por lo básico, transferencia de un archivo entre el host local y un host remoto o viceversa y entre hosts remotos.

Transferencia de un archivo de local a un host remoto:

  • Archivo local: archivo.tar.gz
  • Usuario remoto: foo
  • Host remoto: 192.168.1.100
  • Ruta remota donde enviar el archivo: /home/foo
$ scp archivo.tar.gz foo@192.168.1.100:/home/foo/

Transferencia de un archivo de un host remoto a local:

  • Archivo remoto: archivo.tar.gz
  • Usuario remoto: foo
  • Host remoto: 192.168.1.100
  • Ruta local donde guardar el archivo: /home/bar/
$ scp foo@192.168.1.100:/home/foo/archivo.tar.gz /home/bar/

Transferencia de archivos entre dos hosts remotos:

  • Host remoto #1: 192.168.1.100
  • Archivo remoto en #1: archivo.tar.gz
  • Usuario remoto #1: foo
  • Host remoto #2: 192.168.1.200
  • Ruta remota de #2 donde guardar el archivo: /home/bar/
  • Usuario remoto #2: bar
$ scp foo@192.168.1.100:/home/foo/archivo.tar.gz bar@192.168.1.200:/home/bar/

Copia recursiva y con wildcards (*)

Aunque no suele ser lo más habitual usar scp para realizar copias recursivas o de grandes cantidades de archivos (para eso solemos usar rsync en combinación con ssh), conviene saber que es posible hacerlo.

Para copiar recursivamente archivos y directorios utilizamos el parámetro “-r”. El siguiente ejemplo muestra como copiar todo el contenido (archivos y directorios) de la ruta local “/home” a la ruta remota “/var/tmp”. En la slida estándar van apareciendo los archivos (los directorios no aparecen) transferidos:

$ scp -r /home/ foo@192.168.1.100:/var/tmp
foo@192.168.1.100 password:
VBoxSVC.log.1 100% 2460 2.4KB/s 00:00
VirtualBox.xml 100% 2793 2.7KB/s 00:00
VBoxSVC.log.3 100% 3395 3.3KB/s 00:00
solaris.xml 100% 3573 3.5KB/s 00:00
CentOS6.xml 100% 3674 3.6KB/s 00:00
[...]

Si en lugar de copia recursiva lo que queremos es utilizar wildcards (*) podemos hacerlo como si un “cp” u otro comando estándar se tratara. En el siguiente ejemplo copiamos todos los archivos de /home/foo pero sin recursividad de directorios:

$ scp /home/foo/* bar@192.168.1.100:/tmp

Podemos especificar extension de archivos o patrones para filtrar:

$ scp /home/foo/*.log bar@192.168.1.100:/tmp

Limitar velocidad de SCP

Para limitar el ancho de banda utilizado durante la transferencia de datos con scp se utiliza el parámetro “-l” seguido del máximo de Kbit/s a utilizar durante la copia.

$ scp -l 500 archivo.tar.gz foo@192.168.1.100:/tmp

Habilitar compresión al tráfico de SCP

El parámetro -C activa la compresión en la transferencia de datos vía sc. Si al utilizarlo activamos también el debug ampliaremos la información por salida estándar con los ratios de compresión aplicados entre otras estadísticas:

$ scp -Cv archivo.tar.gz foo@192.168.1.100:/home/foo/

[...]
Transferred: sent 86744, received 1696 bytes, in 7.0 seconds
Bytes per second: sent 12471.8, received 243.8
debug1: Exit status 0
debug1: compress outgoing: raw data 93447, compressed 84606, factor 0.91
debug1: compress incoming: raw data 148, compressed 116, factor 0.78

Mantener stats de archivos (atime, mtime, permisos)

Al igual que cuando copiamos con el comando “cp”, el parámetro “-p” mantendrá los datos de fecha de modificación, fecha de acceso y modos del fichero original:

$ scp -p archivo.tar.gz bar@192.168.1.100:/tmp

Ejemplo de stats:

$ stat archivo.tar.gz
  File: `archivo.tar.gz'
  Size: 93178     	Blocks: 184        IO Block: 4096   regular file
Device: 805h/2053d	Inode: 550538      Links: 1
Access: (0644/-rw-r--r--)  Uid: ( 1000/    alex)   Gid: ( 1000/    alex)
Access: 2014-09-20 09:10:14.590601162 +0200
Modify: 2014-09-20 09:10:31.210683568 +0200
Change: 2014-09-20 09:10:31.210683568 +0200
 Birth: -

Cambiar el cifrado a utilizar para la transferencia de datos

No suele ser muy habitual, pero si por algún casual necesitas cambiar el tipo de cifrado a utilizar durante la transferencia de archivos por scp, puedes hacerlo con el parámetro “-c”. Algunos métodos de cifrado disponibles (protocol version 2) son “3des-cbc”, “aes128-cbc”, “aes192-cbc”, “aes256-cbc”, “aes128-ctr”, “aes192-ctr”, “aes256-ctr”, “arcfour128”, “arcfour256”, “arcfour”, “blowfish-cbc, y “cast128-cbc”.

$ scp -c aes128-ctr archivo.tar.gz bar@192.168.1.100:/tmp

Verbose y Quiet Mode

Habrá ocasiones en las que queramos visualizar la mayor información posible de las conexiones scp/ssh y la transferencia de archivos y otras en las que no queramos nada de salida estándar.

Para ampliar la información lo hacemos igual que con ssh, con el parámetro “-v”. Básicamente tendremos información en modo debug de la conexión, autenticación y configuración.

$ scp -v archivo.tar.gz foo@192.168.1.100:/home/foo
Executing: program /usr/bin/ssh host 192.168.1.100, user foo, command scp -v -t -- /home/foo
OpenSSH_5.9p1 Debian-5ubuntu1.4, OpenSSL 1.0.1 14 Mar 2012
debug1: Reading configuration data /etc/ssh/ssh_config
debug1: /etc/ssh/ssh_config line 19: Applying options for *
debug1: Connecting to 192.168.1.100 [192.168.1.100] port 22.
debug1: Connection established.
debug1: identity file /home/alex/.ssh/id_rsa type 1
debug1: Checking blacklist file /usr/share/ssh/blacklist.RSA-2048
[...]

Y si lo que queremos es deshabilitar toda la salida estándar, utilizaremos la opción “-q”, que deshabilitará tanto la barra de progreso como cualquier aviso o mensaje de diagnóstico.

$ scp -q archivo.tar.gz foo@192.168.1.100:/home/foo

Cambiar el puerto de conexión

Esta es fácil. Si SSH está corriendo en un puerto distinto al TCP 22 deberemos cambiarlo también al utilizar SCP. Para ello utilizamos el parámetro “-P” seguido del puerto:

$ scp -P 6922 archivo.tar.gz foo@192.168.1.100:/home/foo

Utilizar un fichero de configuración de cliente ssh distinto (ssh_config)

Podemos realizar configuraciones personalizadas para SSH y SCP en un fichero de configuración alternativo e invocarlo desde línea de comandos al ejecutar SCP, de este modo nos ahorramos tener que añadir múltiples parámetros que pueden ser configurados en el archivo de configuración. Especificamos el path a ssh_config con el parámetro “-F”:

$ scp -F /home/alex/ssh_config_SCP archivo.tar.gz foo@192.168.1.100:/tmp

Executing: program /usr/bin/ssh host ...
OpenSSH_5.9p1 Debian-5ubuntu1.4, OpenSSL 1.0.1 14 Mar 2012
debug1: Reading configuration data /home/alex/ssh_config_SCP
debug1: /home/alex/ssh_config_SCP line 19: Applying options for *
[...]

2 comentarios en “Comando SCP: ejemplos de uso

Deja un comentario

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