De vez en cuando, necesitamos reiniciar nuestro router. Por ejemplo, para provocar un cambio de IP, si tenemos IP dinámica. Podemos acceder al panel de administración del router mediante el navegador, normalmente en el puerto 80 u 8080, aunque también es posible hacerlo a través de telnet, en el puerto 22.

Para hacer más sencillo este trámite, utilizaremos un script que se conecta por telnet al router, introduce el usuario y la contraseña y lo reinicia mediante el comando reboot. Esto dependerá de cada modelo de router en concreto, pero creo que funciona para un gran número. En principio, no es posible apagarlo, sólo reiniciarlo.

El siguiente script, router.sh, permite ejecutar un comando en el router utilizando expect:

#!/usr/bin/expect -f
set timeout 20
set username "admin"
set password "admin"
set ip "192.168.1.1"

# Read command as arg to this script
set cmd [lindex $argv 0]

spawn telnet $ip

expect "Login:"
send -- "$username\r"
expect "Password:"
send -- "$password\r"

expect " > "
send -- "$cmd\r"

expect " > "
send -- "^D"

Para reiniciarlo, ejecutamos:

$ router.sh reboot

Para obtener un listado de comandos disponibles, en este caso en un Comtrend:

$ router.sh help
spawn telnet 192.168.1.1
Trying 192.168.1.1...
Connected to 192.168.1.1.
Escape character is '^]'.
BCM96328 Broadband Router
Login: admin
Password:
 > help
?
help
logout
exit
quit
reboot
adsl
xdslctl
xtm
brctl
cat
loglevel
logdest
virtualserver
ddns
df
dumpcfg
dumpmdm
meminfo
psp
kill
dnsproxy
syslog
echo
ifconfig
ping
ps
pwd
sntp
sysinfo
tftp
wlctl
arp
defaultgateway
dhcpserver
dns
lan
lanhosts
passwd
ppp
restoredefault
route
save
swversion
cfgupdate
swupdate
exitOnIdle
wan
build
version

Mejorando el script

Un inconveniente es que los datos de conexión, usuario, contraseña e IP, están escritos directamente en el script. Podemos modificar el script para que nos pida los datos, o pasárselos como parámetros, pero si lo hacemos así, prácticamente no ganamos nada respecto a conectarnos directamente por telnet al router.

Mediante yad (yet another dialog, un fork mejorado de zenity), crearemos una sencilla interfaz gráfica que nos pida los parámetros previamente.

Básicamente, consiste en mostrar una pantalla con 3 campos y los botones de aceptar y cancelar. La IP del router se obtiene de la salida del comando route. Una vez que se haya reiniciado el router, nos aparecerá una ventana mostrándonos la nueva IP.

action=$(yad
   --title "Router Reboot"
   --image=gnome-shutdown
   --form
   --field=Username
   --field=Password:H
   --field=Gateway
   --separator=" "
   --button="gtk-ok:0"
   --button="gtk-cancel:1"
$username $password $gateway)
ret=$?

Router reboot

Si le damos a aceptar, la variable $action contendrá el valor de las variables $username, $password y $gateway separados por un espacio, y $ret contendrá el valor del botón pulsado, 0 para aceptar y 1 para cancelar.

$ echo $action
admin admin 192.168.1.1
$ echo $ret
0

Enlace al script router-reboot.


Actualizado el 26 de mayo de 2013

Ha caído en mis manos el router Comtred VR-3025u de Jazztel, que permite renovar la IP sin tener que reiniciar el router, por lo que el cambio es mucho más rápido que esperar a que reinicie.

He encontrado el siguiente script en un foro de Banda Ancha para llevar a cabo la renovación de la IP:

#!/bin/sh

# vr3025u
IFACE=ppp1.1

# vr3025un
#IFACE=ppp1

USER=admin
PASS=admin
IP=192.168.1.1

( sleep 3
  echo $USER
  sleep 1
  echo $PASS
  sleep 1
  echo ppp config $IFACE down
  sleep 5
  echo ppp config $IFACE up
  sleep 1
  echo exit ) | telnet $IP

Referencias

» Shell script to reboot DSL/ADSL router » yad examples » Script cambio IP Comtrend VR-3025un (para JDownloader)


Entradas relacionadas


Published

Category

admin

Tags

Contacto