SSH es una herramienta para loguearse en un sistema remoto y ejecutar comandos. Provee un mecanismo de comunicación seguro encriptado entre dos hosts sobre una red insegura. SSH se conecta y se loguea en el sistema remoto indicado y el usuario debe probar su identidad utilizando alguno de los métodos de autenticación disponibles dependiendo de la versión del protocolo utilizada (por ejemplo usuario y contraseña, clave pública mediante certificados, basado en hosts, challenge-response). Generalmente utilizamos SSH para iniciar una sesión en un sistema remoto, pero lo que muchos puede que no sepan es que SSH no sólo sirve para iniciar una sesión remota, sino que también tiene la posibilidad de simplemente ejecutar un comando en el sistema remoto y retornar su salida, en lugar de abrir una shell.

Veamos qué dice el manual del cliente SSH:

$ man ssh
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 log_file] [-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]
     ssh -Q protocol_feature

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 communications 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.

En el último párrafo del texto anterior dice: "Si se especifica un comando, éste es ejecutado en el host remoto en lugar de una shell de login."

Entonces, utilizando el cliente SSH uno podría, por ejemplo, listar un directorio en un sistema remoto de la siguiente forma:

[emi@hal9000 ~]$ ssh root@www.pepe.org ls -lh /etc/apache2/
root@www.pepe.org's password: 
total 76K
-rw-r--r-- 1 root root 7.9K Apr  1  2012 apache2.conf
drwxr-xr-x 2 root root 4.0K May 15 11:24 conf.d
-rw-r--r-- 1 root root 1.2K Apr  1  2012 envvars
-rw-r--r-- 1 root root    0 Aug  7  2012 httpd.conf
-rw-r--r-- 1 root root  31K Apr  1  2012 magic
drwxr-xr-x 2 root root  12K Aug  4 11:03 mods-available
drwxr-xr-x 2 root root 4.0K Nov 19  2013 mods-enabled
-rw-r--r-- 1 root root  750 Apr  1  2012 ports.conf
drwxr-xr-x 2 root root 4.0K May 15 11:24 sites-available
drwxr-xr-x 2 root root 4.0K Nov 19  2013 sites-enabled
[emi@hal9000 ~]$ 

De igual forma, podría actualizar el sistema (en este caso Debian) ejecutando esta única línea de comando:

$ ssh root@www.pepe.org "apt-get update && apt-get upgrade"

La única consideración a tener en cuenta es que si el comando utiliza pipes, operadores u otro caracter especial, que pueda interpretarse como parte del comando de la sesión local, debe ser encerrado entre comillas dobles, tal como se observa. Y si el comando a enviar al mismo tiempo requiere el uso de comillas dobles, éstas deben ser escapadas agregando una barra invertida (\) por delante. Por ejemplo, si se requiere ejecutar el comando echo "192.168.100.155 testdb2" >> /etc/hosts en el host remoto:

$ ssh root@www.pepe.org "echo \"192.168.100.155 testdb2\" >> /etc/hosts"

Espero que les sirva para ahorrar tiempo.


Tal vez pueda interesarte


Compartí este artículo