jueves, 30 de agosto de 2007

Tranquilo pero Expectante

Hay por ahí un lenguaje por llamarle algo, de nombre EXPECT. Lo curioso de este lenguaje es que esta pensado para realizar dialogos, tomando como canal de comunicación la entrada y la salida standard. ¿Y que para que sirve eso? Pues para automatizar tareas o realizar scripts que tengan que dialogar con otras aplicaciones.

La sintaxis del lenguaje es muy sencilla y los 3 comandos básicos son spawn (ejecutar un comando o script), expect (espera a recibir algo) y send (envia lo que le digas por la salida standard). Hay más os podeis documentar aki.

Antes de nada hay que instalar Expect en vuestra maquina con Ubuntu, para ello os podeis hacer un script de instalación que contendría las siguientes lineas:

#!/bin/bash
gksudo apt-get install expect


El ejemplo típico es el de automatizar la bajada y/o subida por ftp. Yo en este post pondré como ejemplo como sacar la ip publica con la que esta conectado mi router. El modelo de router que estoy utilizando es "router inalámbrico Xavi 7868r". El modelo de router nos va a determinar que comandos habrá que enviarle por telnet para que nos diga la IP. De todos los router que han pasado por mis manos todos tienen telnet y un juego de comandos para configurarlo o ver su configuración, esto a parte del servidor web. Por lo que creo esto vale para cualquiera que tenga un router y este interesado en saber su IP pública.

Antes de nada intentaros conectar a vuestro router, por telnet desde la consola. Para ello hacer:

$ telnet [ip del router]


Una vez hecho esto quedaros con la linea escrita por pantalla que os pide el login. Introducir el login.
Fijaros como os pregunta el router el password. Y fijaros como es promtp de la consola. Una vez hecho esto tenenis que averiguar que comando os dice la IP pública y aqui os toca investigar, probar introduciendo help, ? , ... para conseguir un listado de los comandos disponibles. Cuando sepais esto averiguar cual es el comando para salir. Una vez logrado esto ya teneis toda la información necesaria para realizar este script de expect con exito. Datos que hay que apuntar :
  • texto que usa el router para preguntar el login
  • idem para el password
  • idem pero para el prompt de la consola
  • comando para saber la ip pública
  • comando para salir
  • usuario y password
Si habéis conseguido toda esta información o tenéis un router como el mio ya podeis ejecutar este script para saber cual es la IP pública de casa en un moment sin tener que preguntarselo a mano al router. O para usar esta info en otros programas. En mi caso lo uso para tener mi equipo localizado ya como tengo IP dinámica, nunca se que ip tiene y no puedo acceder a ordenata. Hay otras alternativas como usar servicios gratuitos de terceros que te asignan una DNS a tu ip dinámica, pero se necesita de un cliente y se depende de la empresa que te el servicio. Yo con ayuda de otro script me envío a mi dir de correo electrónico la ip de mi equipo cuando esta ha cambiado. Y de esta manera siempre que tengo internet puedo acceder a mi maquina. :)

Script que escupe la ip publica del router :

#!/usr/bin/expect
#lanzamos un cliente de telnet
spawn telnet 192.168.1.1
#esperamos a que nos pida el login
expect "Login:"
#enviamos nuestro login
send "1234\r"
#esperamos a que nos pregunte el pass
expect "Password:"
#enviamos el password
send "1234\r"
#esperamos a que envie el prompt de la linea de comandos
expect -exact "-->"
#enviamos el comando para que nos liste las interfaces de red
send "ip list interfaces\r"
expect -exact "-->"
#enviamos el comando de salida
send "user logout\r"


Lo que va entrecomillado es la info que se envía que variara en función de cada router. Si tenéis el mismo router que yo. solo tenéis que cambiar el usuario y el password.



No hay comentarios: