Archivos para 16/02/11

[Script] Mejorando la productividad: Automatizando conexiones SSH mediante expect

Trabajo mucho con máquinas remotas, en estos casos me gusta abrir mi terminal y conectarme rapidamente utilizando SSH, lo cual no siempre es “tan rápido” porque he de introducir la contraseña u otros parametros de inicio. Para estos casos recomiendo utilizar aplicaciones tan geniales como Pac Manager, que nos simplifica mucho estas tareas o habilitar la posibilidad de conexion SSH sin necesidad de usar contraseña (mediante clave pública). Pero no siempre podemos hacer lo que queramos en máquinas ajenas o instalar software adicional, asi que me plantee crearme unos sencillos scripts que me permitan acceder rapidamente a todas las máquinas remotas que necesite mediante SSH. Son los siguientes y puedes mejorarlos o personalizarlos como necesites.

conectar

conectar es el script principal, es un script que utiliza el comando “expect” (deberás tenerlo instalado en la máquina) y recupera los siguientes parametros que se le pasan por la linea de comandos: máquina, usuario, password, directorio de inicio y caracter usado para el prompt. Su funcionalidad es tan simple como automatizar la conexion ssh de manera que no sea necesario indicar la password y que nos deje en el directorio indicado. Entonces inicia una sesión interactiva para que escribamos los comandos que necesitemos en la máquina remota.

#!/usr/bin/expect

set host [lindex $argv 0]
set user [lindex $argv 1]
set password [lindex $argv 2]
set prompt [lindex $argv 3]
set directorio [lindex $argv 4]

spawn  ssh $user@$host
expect "password:"
send "$password\n";
expect "$prompt"
send "cd $directorio\n";
expect "$prompt"
interact

c.txt

Es el fichero que utilizo como base de datos para guardar los datos de las máquinas remotas. Pienso utilizar sqlite más adelante pero no queria complicarlo mucho inicialmente para aquellos que desconozcan el uso de sqlite. El fichero es de la forma:

soledad|127.0.0.1|jose|jose|/home/jose/Escritorio|>|SSH|Mi servidor ssh
# Formato: alias | ip | user | password | directorio | prompt | protocolo | descripcion

Es decir, añades una linea por cada máquina a la que quieras conectar y en esta linea indicas el nombre de la conexion (alias a usar), la dirección ip de la máquina, el usuario con el que conectar, la password, el directorio base de inicio donde quieres quedarte al inicio de la sesión, el prompt utilizado y el protocolo.

c

Es el script de bash que se encarga de llamar al script de expect (conectar) con los parametros adecuados. Su función principal es a partir de un alias que se le pasa como parametro, examinar el fichero c.txt y extraer la ip, user, password y directorio de esa máquina, para pasarle esos parametros a expect (script conectar). Si no se le pasa ningún parametro lo que hace es imprimir la lista actual de alias del fichero c.txt a modo de recuerdo de las máquinas a las que puedes conectar.


#!/bin/bash

CONSOLA=false
repo="${HOME}/UTIL/c.txt"
RUTA_LIB="${HOME}/UTIL/"

function DEBUG()
{
	if ( $CONSOLA )
	then
		echo "DEBUG: $1 \n"
	fi
}
#-----

GET_IP()
{
	busqueda="$1"
	#DEBUG "Buscando por : [ $busqueda ]"
	cat $repo | grep $busqueda | awk -F"|" '{print $2}'

}
#----

GET_USER()
{
	busqueda="$1"
	#DEBUG "Buscando por : [ $busqueda ]"
	cat $repo | grep $busqueda | awk -F"|" '{print $3}'

}
#----

GET_PASSWORD()
{
	busqueda="$1"
	#DEBUG "Buscando por : [ $busqueda ]"
	cat $repo | grep $busqueda | awk -F"|" '{print $4}'

}
#----

GET_DIRECTORIO()
{
	busqueda="$1"
	#DEBUG "Buscando por : [ $busqueda ]"
	cat $repo | grep $busqueda | awk -F"|" '{print $5}'

}
#----

CONECTAR_SSH()
{
	${RUTA_LIB}conectar "$1" "$2" "$3" "$4" "$5"
}

SSH()
{
alias="$1"
_Host=`GET_IP "$alias"`
_User=`GET_USER "$alias"`
_Pass=`GET_PASSWORD "$alias"`
_Directorio=`GET_DIRECTORIO "$alias"`
_Prompt=">"
CONECTAR_SSH "$_Host" "$_User" "$_Pass" "$_Prompt" "$_Directorio"
}

ALIASNAME="$1"
if [ -z $ALIASNAME ];
then
	echo "Sintaxis: $0 <alias o nombre maquina>"
	echo ""
	echo "Conexiones disponibles:"
	echo "-----------------------"
	echo ""
	tac $HOME/UTIL/c.txt | grep -v "#" | awk -F"|" '{print $1}' | sort

else
	SSH "$1"
fi;

Nota importante: por defecto todos estos scripts deben estar ubicados en $HOME/UTIL aunque se podria editar fácilmente el último script para que utilizara otro path.

Nota 2: el prompt de momento no lo uso y paso por defecto “>” pero es fácil de usar el que sea necesario. p.ej “$”

Por último sólo seria necesario crear el siguiente “alias” en nuestro fichero .bashrc

alias sshe=’$HOME/UTIL/c \$1′

Uso “sshe” por que me recuerda a “ssh y la e es de expect” pero podrias usar cualquier otro nombre.

Ahora conectar a cualquier máquina es tán simple como ejecutar desde consola:

$ sshe alias_de_la_maquina

Ejemplo:

$ sshe soledad

(usa tus propias máquinas de acuerdo al fichero c.txt)

y los scripts anteriores ya se encargan de dejarte el terminal preparado con la conexión ssh abierta.

He preparado un instalador que se encarga de copiar ya todo a tu directorio $HOME/UTIL. Puedes descargarlo junto al resto de scripts del siguiente enlace (nota: wordpress no me deja subir ficheros .zip directamente , asi que está renombrado como .doc pero realmente es un fichero .zip, cambiale la extensión y ya lo podrás descomprimir).

Espero que sea útil, a mi por lo menos si que me lo resulta.

Descarga | SSHE.zip



The next version of Ubuntu is coming soon


¿Es compatible tu equipo con Ubuntu?


( Muchos fondos de pantalla, aqui )

DESCARGATE SCIFI LIFE

365 Dias de Soledad
Me debes los sueños, las promesas y las noches rotas. Me debes la paz, la sonrisa y la esperanza robadas. Me debes la sangre, las lágrimas y el sudor vertido. Me debes las noches vacías, los abrazos anhelados. Me debes un beso de ajenjo de tu amarga boca.

The Ubuntu Counter Project - user number # 11961
Geo Visitors Map
febrero 2011
L M X J V S D
« ene   mar »
 123456
78910111213
14151617181920
21222324252627
28  

Blog Stats

  • 26,207,030 hits

Seguir

Recibe cada nueva publicación en tu buzón de correo electrónico.

Únete a otros 1.014 seguidores