viernes, 16 de enero de 2015

Tip Consola: Shell Script para reiniciar el router


A muchos de nosotr@s nos interesa reiniciar el router inalambrico para por ejemplo obtener una IP dinamica diferente. La forma habitual es levantarnos del sitio, acercarnos al router y darle un “botonazo”, pero claro, esto nos obliga fisicamente estar en el sitio. En muchos routers existe la posibilidad de hacer lo mismo mediante la consola de comandos. Basicamente serian los siguiente pasos:
1. Hacer un telnet a la direccion del router.
2. Introducir el usuario y la password de acceso al router.
3. Ejecutar el comando de reboot del router.
Ejemplo:
$ telnet 192.168.1.1
$ Login:
PERICO
$ Password:
EL_DE_LOS_PALOTES
Login succesful
-->
reboot

Naturalmente tendras que usar el login y password de tu router (el que viene de fabrica, o el que hayas puesto si ya lo has cambiado). El comando para reiniciar el router en mi caso es “reboot” y la lista de comandos posibles me salen cuando introduzco “?” desde la ventana de telnet. En tu caso, si el comando no es este, debera ser muy parecido.
Veamos como automatizar ahora, el reboot de el router mediante un shell script.
Para automatizar la ejecucion del shell script y no tener que pasarle a mano el usuario y la password, sino que me las lea desde la consola yo he usado “expect”.
expect es un interprete de comandos que nos permite automatizar secuencias de acciones, de esta manera podemos evitar el tener que introducir comandos, solo lo hacemos la primera vez y el resto de veces se ejecuta ya lo que hubieramos realizado (de expect ya hable aunque por desgracia no tengo el tutorial a mano).
Para instalar expect ejecutamos:
$ sudo apt-get install expect
Si instalamos tambien autoexpect. Podriamos ejecutarlo directamentes:
$ chmod +x ./autoexpect
$ ./autoexpect

Grabar la secuencia de comandos que queremos automatizar, y para finalizar escribir “exit”. De esta manera se genera un fichero expect de comandos de manera automatica que luego podriamos ejecutar cuando quisieramos.
Para reiniciar el router, en mi caso uso el siguiente script de expect:
#!/usr/bin/expect
spawn telnet [lindex $argv 0]
expect "Login:"
send [lindex $argv 1]
send "\r"
expect "Password:"
send [lindex $argv 2]
send "\r"
expect -exact "\r
\r
Login successful\r
\r
--> "
send "reboot"
send "\r"
sleep 1
interact
exit

 realmente hago un telnet a la ip del router que paso como parametro, espero por la cadena “Login:” y le paso el login, espero por la cadena “Password” y le paso el password, espero por la cadena “–>” que es la que me indica que ya puedo escribir el comando en mi router, y para acabar le paso la cadena “reboot” que es el comando que quiero ejecutar, y finalizo.
Guardo este script como reboot_router.sh
y ya podria ejecutarlo siempre que quisiera:
$ chmod +x ./reboot_router.sh
$ ./reboot_router.sh 192.168.1.1 PERICO EL_DE_LOS_PALOTES

Tras unos segundos, el router se reinicia y ya tengo nueva IP.
Si el script no es identico debe ser bastante parecido.