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.