Estoy intentando conectarme a mi enrutador a través de telnet usando este script:
#!/usr/bin/expect -f
set timeout 20
# router user name
set name "admin"
# router password
set pass "admin"
# router IP address
set routerip "192.168.1.1"
# Read command as arg to this script
set routercmd "cat /var/1.leases"
# start telnet
spawn telnet $routerip
# send username & password
expect "username:"
send -- "$name\n"
expect "password:"
send -- "$pass\n"
# get out of ISP's Stupid menu program, go to shell
expect "TBS>>"
send -- "sh\n"
# execute command
expect -re ".*\$"
send -- "$routercmd\n"
# exit
send -- "^D"
Ahora el guión funciona bien hasta el send -- "sh\n"
papel. Llega al símbolo del shell que aparece como: ~ $
(tilda-espacio-dólar-espacio). Sin embargo, no puedo emitir el comando después de esto. Básicamente, simplemente no funciona después de eso.
¿Alguien puede decir por qué? ¿Es algún error que estoy cometiendo?
Respuesta1
Bueno. Lo rompí. Tenía que hacer algo con una coincidencia de patrones incorrecta en la expect
parte de las líneas finales del código.
Lo primero que hice fue generar un script grabado usando autoexpect
. Esta herramienta se utiliza para registrar sus sesiones y generar un script basado en eso. Para hacerlo, primero instalé el autoexpect
paquete (disponible en expect-dev
el paquete en sistemas basados en Debian) y luego grabé mi sesión:
sudo apt-get install expect-dev #Since I'm on Ubuntu
autoexpect telnet 192.168.1.1
autoexpect
generó automáticamente un script para mí. Cuando ejecuté este script, estaba llegando hasta la ejecución de mi comando y ejecutándolo en el enrutador, pero luego no pude salir. Tomando sugerencias de este script y leyendo la página de manual de expectativa, finalmente descubrí que había algún problema con el reconocimiento de patrones. Finalmente modifiqué el script en consecuencia y esto es lo que finalmente funciona:
#I am mentioning here only the end part of the complete script which was faulty
# execute command
expect "~ \$ "
send -- "$routercmd\r"
expect "~ \$ "
send -- "exit\r"
expect -- "TBS>>"
send -- "exit\r"
expect -- "*Are you sure to logout?*"
send -- "y"
expect eof
Entonces, la lección aprendida fue que debemos usarlo autoexpect
para generar scripts automáticamente. Y luego, si hay algún error en esos scripts generados automáticamente, lo más probable es que se deba a un reconocimiento de patrón incorrecto en la expect
pieza.
En mi caso, la pieza esencialmente defectuosa fue:
expect -re ".*\$" #WRONG
expect "~ \$ " #RIGHT
Las piezas defectuosas dependerán completamente de su sesión, con quién se comunique. Ponerse en contacto con un servidor de correo a través de telnet arrojará resultados diferentes y tendrá que hacer coincidir en consecuencia.