By | 2 febrero, 2010

Algnas veces me ha tocado escriir líneas de ssh bastante complejas, como por ejemplo:

ssh -1 -p 23 -l root -i /etc/ssh/key01 -o CheckHostIP=no 192.134.27.24

que realmente terminan siendo un incordio, cuando esa conexión debe ser vuelta a realizar para repetir tareas de administración remota. Entonces, este artículo es un resúmen de algunos trucos de automatización que he logrado aprender hasta ahora, para hacer mi ssh más fácil y mi vida también.

1. el nombre

Escribir la IP 192.134.27.24 cada vez que me conecto es antidiluviano y no escala a IPv6. Así que lo ideal es disponer de un DNS bien configurado al cuál recurrir.

Lamentablemente en redes internas he visto que asignan nombres a las máquinas que resultan más difíciles que la dirección IPv4 misma, por ejemplo: sssd2p1r3db.sss.com, que significa sss es el nombre de la empresa, datacenter 2, piso 1, rack 3, db pues es el server de base de datos. Fantástico! Cómo no recordarlo? Claro, despues uno ve que terminan usando la IP.

Así que llamemos a nuestro servidor 192.134.27.24 sssd2p1r3db como «tito» (o cualquier otro nombre que me resulte fácil de recordar)

Para que funcione el ssh a tito debo llegar a la IP. Y esta tarea de personalización de los nombres en la red la hace el archivo /etc/hosts. Edito el archivo y agrego:

# Servidor sssd2p3r3db
192.134.27.24 tito

A partir de ahora, todo lo que yo haga a nivel de red con el nombre «tito» va a funcionar desde ssh tito, ping tito, hasta http://tito en el Firefox.

2. las opciones ssh

Las opciones del ssh que son necesarias para esta conexión de ejemplo son: -1 -p 23 -l root -i /etc/ssh/key01 -o CheckHostIP=no, que no es necesario explicar su significado, pues todas estas opciones están a un man de distancia.

El archivo que permite automatizar todo esto para todos los usuarios es /etc/ssh/ssh_config y para un usuario en específico es el archivo $HOME/.ssh/config. Edito el archivo y creo una entrada Host acorde a mis necesidades:

Host tito
Protocol 1
Port 23
User root
IdentityFile /etc/ssh/key01
CheckHostIP no

Y ya está!

Ahora puedo escribir ssh tito y mi conexión va a ser realizada exactamente como si escribiera toda la linea del principio.

Solo una aclaración: la sentencia Host funciona por string, es decir que si escribo ssh 192.134.27.24 no va a producir el mismo efecto de levantar los datos del ssh_config, aunque me esté conectando al mismo servidor.

3. Bash completion

Y por último, hacer que mi Bash permita usar tabulador para los nombres caprichozos y fáciles que he colocado a mis servidores… porque?, a ver: nadie pretende que me acuerde que el server se llama «tito», es mucho más acordarme que empieza con «t» y sigue con «algo» 😉

Edito ~/.bashrc y agrego:

_completossh ()
{
actual=${COMP_WORDS[COMP_CWORD]};
COMPREPLY=($(compgen -W ‘$(cat /etc/ssh/config | grep «^Hostb» – | sed -e «s/Host //»)’ — $actual))
}
complete -F _completossh ssh

Y ahora puedo escribir ssh t + tabulador, y me completará «tito». Y si tengo más de un servidor que comience con «t» pues dar dos veces tabulador y me muestra la lista.

4. Algunos documentos para leer del tema

5 Replies to “Automatizando SSH”

  1. Alberto

    Espectacular!
    La opcion del .ssh/config la tenia pero no el autocomplete….
    ¡de pelos!! 🙂

  2. Rodolfo Pilas

    Alberto, en caso que uses el .ssh/config la línea que carga COMPREPLY debe ser:

    COMPREPLY=($(compgen -W ‘$(cat $HOME/.ssh/config | grep “^Hostb” – | sed -e “s/Host //”)’ — $actual))

  3. Gustavo Muslera

    Si es por automatizar:
    – Fabric (fabfile.org) da scripting python a sesiones ssh. Mucho puede ser mas del aspecto de archivo de configuracion que de script python completo
    – En perl Net::SSH::Perl da scripting perl a lo hacer remotamente. Para algo chico y puntual puede ser overkill, pero si es algo que puede repetirse tal vez valga la pena poner un poco de esfuerzo.
    – Mucho de lo que es automatizar es administracion o configuracion remota, ahi Chef, Puppet, cfEngine y muchos otros pueden automatizar algunos tipos de tarea, sin siquiera conectarse via ssh

  4. Pingback: Verificando certificados SSL desde la línea de comandos | Rio Pilas Rio Pilas

Deja una respuesta

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