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 * [...]