Además de proveer el acceso sistemas remotos, SSH (Secure Shell) permite ejecutar comandos. El cliente ssh se conecta y se loguea en el sistema especificado, mediante un nombre de host (hostname) pasado por parámetro (opcionalmente junto con un nombre de usuario). El usuario debe probar su identidad en la máquina remota utilizando uno de varios métodos disponibles (por ejemplo passwords, certificados, etc.), de acuerdo a la configuración del servidor ssh.

Generalmente todos utilizamos SSH para obtener el acceso a una shell en un sistema remoto a través de un canal seguro (cifrado). Aunque, si se especifica un comando, se ejecuta el mismo en el host remoto en lugar de retornar una shell de login.

Aprovechando esta funcionalidad, junto con tar, es posible transferir/copiar/mover archivos entre sistemas remotos sin necesidad de contar con FTP (File Transfer Protocol), SFTP (Secure File Transfer Protocol) o SCP (Secure Copy). Tal como demostraré en este artí­culo.

Tal como explica el manual de ssh (man ssh), si se especifica un comando (como último parámetro), se ejecuta el mismo en el host remoto en lugar de retornar una shell de login:

SSH(1)                    BSD General Commands Manual                   SSH(1)

NAME
     ssh - OpenSSH SSH client (remote login program)

SYNOPSIS
     ssh [-1246AaCfgKkMNnqsTtVvXxYy] [-b bind_address]
         [-c cipher_spec] [-D  [bind_address:]port] [-e escape_char]
         [-F configfile] [-I pkcs11] [-i identity_file] [-L
         [bind_address:]port:host:hostport] [-l login_name]
         [-m mac_spec] [-O ctl_cmd] [-o option] [-p port] [-R
         [bind_address:]port:host:hostport] [-S ctl_path]
         [-W host:port] [-w local_tun[:remote_tun]] [user@]hostname
         [command]

DESCRIPTION
     ssh (SSH client) is a program for logging into a remote machine
     and for executing commands on a remote machine.  It is intended
     to replace rlogin and rsh, and provide secure encrypted communi-
     cations between two untrusted hosts over an insecure network.
     X11 connections and arbitrary TCP ports can also be forwarded
     over the secure channel.

     ssh connects and logs into the specified hostname (with optional
     user name).  The user must prove his/her identity to the remote
     machine using one of several methods depending on the protocol
     version used (see below).

     If command is specified, it is executed on the remote host
     instead of a login shell.
:

Por ejemplo, si ejecuto el comando uname -a en el sistema local, retorna:

[emi@hal9000 temp]$ uname -a
Linux hal9000 2.6.32-431.11.2.el6.x86_64 #1 SMP Tue Mar 25 19:59:55 UTC 2014 x86_64 x86_64 x86_64 GNU/Linux

En cambio, si ejecuto el mismo comando como último parámetro en la conexión SSH a un sistema remoto (host "192.168.122.196", autenticado como usuario "root"), el comando se ejecuta en el mismo y la salida se observa en la shell local:

[emi@hal9000 temp]$ ssh root@192.168.122.196 'uname -a'
root@192.168.122.196's password:
Linux ubuntu 3.2.0-34-generic #53-Ubuntu SMP Thu Nov 15 10:48:16 UTC 2012 x86_64 x86_64 x86_64 GNU/Linux

Debido a que el cliente SSH tiene la capacidad de redirigir la salida estándar en el sistema local como entrada estándar del sistema remoto (mediante un pipe |), es posible utilizar un truco para transferir cualquier cantidad de archivos y directorios de forma simple y rápida.


Gráfico creado con yEd.

Veamos directamente un ejemplo. Primero me voy a conectar al servidor remoto:

[emi@hal9000 temp]$ ssh root@192.168.122.196
root@192.168.122.196's password:
root@ubuntu:~# 

Se observa que el $HOME está vací­o, es decir, no contiene archivos:

root@ubuntu:~# ls -l
total 0

Creo un directorio donde voy a guardar los archivos a transferir desde mi sistema local:

root@ubuntu:~# mkdir archivos

Ahora el $HOME posee el directorio "archivos", el cual está vací­o:

root@ubuntu:~# ls -Rl
.:
total 4
drwxr-xr-x 2 root root 4096 Apr 24 12:13 archivos

./archivos:
total 0

Cierro la sesión remota y vuelvo a la shell de mi sistema local:

root@ubuntu:~# exit
logout
Connection to 192.168.122.196 closed.
[emi@hal9000 temp]$

En mi sistema local tengo dos archivos, llamados "archivo1.txt" y "archivo2.txt" (dentro del directorio /tmp/temp), los cuales deseo transferir al sistema remoto, sin utilizar FTP, SFTP ni SCP, sólo SSH.

[emi@hal9000 temp]$ pwd
/tmp/temp
[emi@hal9000 temp]$ ls -l
total 8
-rw-rw-r-- 1 emi emi 11 Apr 24 11:55 archivo1.txt
-rw-rw-r-- 1 emi emi 11 Apr 24 12:06 archivo2.txt
[emi@hal9000 temp]$ cat archivo1.txt
hola mundo
[emi@hal9000 temp]$ cat archivo2.txt
chau mundo

El truco consiste en crear un tar (que incluya todos los archivos que se desean transferir) y enviarlo a la entrada estándar del sistema remoto para ser descompactado al vuelo.

Cuando no se especifica un archivo de salida (utilizando la opción f) tar retorna el contenido compactado por la salida estándar:

[emi@hal9000 temp]$ tar c archivo*
archivo1.txt  archivo2.txt
[emi@hal9000 temp]$ tar c archivo*
archivo1.txt0000664000076400007640000000001312326222761011450 0ustar  emiemihola mundo
archivo2.txt0000664000076400007640000000001312326224201011440 0ustar  emiemichau mundo

Entonces es posible redireccionar la salida de tar a la entrada del cliente ssh mediante un pipe, junto con un comando en el sistema remoto para descompactar al vuelo:

[emi@hal9000 temp]$ tar c archivo* | ssh root@192.168.122.196 'tar x --directory=/root/archivos'
root@192.168.122.196's password:                                                                
[emi@hal9000 temp]$

El comando utilizado para descompactar al vuelo es tar x --directory=/root/archivos. Con la opción x se indica a tar que debe extraer los archivos, y mediante --directory (opcional) se especifica el directorio destino (en este caso utilizo el directorio /root/archivos/).

Veamos si los archivos fueron transferidos correctamente:

[emi@hal9000 temp]$ ssh root@192.168.122.196                                                    
root@192.168.122.196's password:                                                                
root@ubuntu:~# ls -la archivos/
total 16
drwxr-xr-x 2 root root 4096 Apr 24 12:18 .
drwx------ 6 root root 4096 Apr 24 12:13 ..
-rw-rw-r-- 1  500  500   11 Apr 24 11:55 archivo1.txt
-rw-rw-r-- 1  500  500   11 Apr 24 12:06 archivo2.txt
root@ubuntu:~# cat archivos/archivo*
hola mundo
chau mundo
root@ubuntu:~#

Se observa que el usuario y grupo de los archivos transferidos corresponde con el UID y GID 500 respectivamente. Esto sucede porque en el sistema remoto no existe el usuario (ni el grupo) "emi". Por lo tanto luego de transferir los archivos, es necesario corregir user y group con el comando chown, por ejemplo ejecutando:

root@ubuntu:~# chown -R root:root archivos

¡Espero que les haya gustado!


Tal vez pueda interesarte


Compartí este artículo