Espere script para comunicação telnet com roteador DLink

Espere script para comunicação telnet com roteador DLink

Estou tentando me conectar ao meu roteador através do 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"

Agora o script funciona bem até a send -- "sh\n"parte. Ele chega ao prompt do shell que aparece como: ~ $(tilda-space-dollar-space). No entanto, não consigo emitir o comando depois disso. Basicamente, simplesmente não funciona depois disso.

Alguém pode dizer por quê? É algum erro que estou cometendo?

Responder1

OK. Eu quebrei. Teve que fazer algo com correspondência de padrões errada na expectparte das linhas finais do código.

O que eu fiz, em primeiro lugar, foi gerar um script gravado usando autoexpect. Esta ferramenta é utilizada para registrar suas sessões e gerar um script baseado nisso. Para fazer isso, primeiro instalei o autoexpectpacote (disponível em expect-devpacote em sistemas baseados em Debian) e depois gravei minha sessão:

sudo apt-get install expect-dev          #Since I'm on Ubuntu
autoexpect telnet 192.168.1.1

autoexpectgerou automaticamente um script para mim. Quando executei esse script, ele estava chegando até a execução do meu comando e executando-o no roteador, mas não consegui sair. Seguindo dicas deste script e lendo a página de manual expect, finalmente descobri que havia algum problema com o reconhecimento de padrões. Finalmente modifiquei o script de acordo e foi isso que finalmente funcionou:

#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

Então, a lição aprendida foi que deveríamos usar autoexpectpara gerar scripts automaticamente. E então, se houver alguma falha nesses scripts gerados automaticamente, provavelmente será devido ao reconhecimento incorreto de padrões na expectpeça.

No meu caso, a parte essencialmente defeituosa foi:

expect -re ".*\$"    #WRONG
expect "~ \$ "       #RIGHT

As peças defeituosas dependerão totalmente da sua sessão, com quem você está contatando. Entrar em contato com um servidor de e-mail através do telnet retornará resultados diferentes e você terá que combinar de acordo.

informação relacionada