Esperar script para comunicação telnet com o roteador DLink

1

Estou tentando conectar-me ao meu roteador por meio 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 parte send -- "sh\n" . 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 deles que estou cometendo?

    
por shivams 21.05.2015 / 15:34

1 resposta

0

Ok. Eu rachei isso. Ele tinha que fazer algo com correspondência de padrão incorreta na parte expect nas linhas finais do código.

O que eu, primeiro de tudo, fiz foi gerar um script gravado usando autoexpect . Essa ferramenta é usada para gravar suas sessões e gerar um script com base nisso. Para fazer isso, instalei pela primeira vez o pacote autoexpect (disponível no pacote expect-dev em sistemas baseados no Debian) e gravei a minha sessão:

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

autoexpect gerou automaticamente um script para mim. Quando eu corri este script, ele estava chegando até a execução do meu comando e executá-lo no roteador, mas foi então incapaz de sair. Tomando dicas deste script e lendo a página de manual do expect, eu finalmente descobri que havia algum problema com o reconhecimento de padrões. Eu finalmente modifiquei o script de acordo, e é isso 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

Então, a lição aprendida era que deveríamos usar autoexpect para gerar scripts automaticamente. E, em seguida, se houver alguma falha nesses scripts gerados automaticamente, provavelmente seria devido ao reconhecimento de padrão incorreto na parte expect .

No meu caso, a parte essencialmente defeituosa era:

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

As partes defeituosas dependerão completamente da sua sessão, com quem você está contatando. Entrar em contato com um servidor de correio através do telnet retornará saídas diferentes e você terá que corresponder de acordo.

    
por 21.05.2015 / 16:31