Tengo un problema con mi router ADSL de casa. Cada 3 o 4 días se cuelga por alguna extraña razón (¿será saturación? 😛 ) y hay que resetearlo para que vuelva a funcionar. Cansado de estos cuelgues decidí solucionarlo con un pequeño script que mi máquina Linux ejecuta cada dos días de madrugada, así no me entero. Ya no me he vuelto a dar cuenta de los cuelges.
Lo primero que hay que hacer es habilitar el acceso telnet al router desde dentro de la red local, nunca desde el exterior 😛 .
expect es una herramienta que permite automatizar aplicaciones interactivas tipo telnet o ftp, donde tienes que introducir tu usuario y tu clave y alguien tiene que estar ahí para teclearlas. Expect lo que hace es, como su propio nombre indica, esperar determinadas cadenas de texto e introducir los datos que se hayan programado. Pongamos un ejemplo práctico. Cuando haces un telnet tienes la siguiente secuencia de eventos:
[osus@servidor ~]# telnet 192.168.0.100 Trying 192.168.0.100... Connected to 192.168.0.100. Escape character is '^]'. Username: Password:
Es decir, cuando haces un telnet “esperas” la cadena “Username:” para introducir tu usuario y después introduces tu clave cuando recibes “Password:“.
Esto es exactamente lo que automatiza expect. Veamos cómo con un script práctico.
[osus@servidor scripts]# cat router.sh #!/usr/bin/expect -f set force_conservative 1 ; if {$force_conservative} { set send_slow {1 .010} proc send {ignore arg} { sleep .2 exp_send -s -- $arg } } spawn telnet 192.168.0.100 expect "Username :*" send -- "USUARIOr" expect "Password :*" send -- "CLAVEr" expect "ROOT :>*" send -- "rebootr" expect "figuration(y/n) ? :*" send -- "yr" expect -gl "\[*]$*" exit
Creo que habla por sí sólo el script. Esperamos a recibir cada cadena de texto para enviarle nuestros datos. Una vez estamos logueados esperamos la cadena inicial que nos devuelve el router, en mim caso “ROOT :>“. Ahí es cuando le pedimos el reboot y lo confirmamos. Ya está, el router se reinicia sólo. Obviamente todas las cadenas que esperas recibir deben coincidir con las de tu router, las aquí indico son las del mío.