打击和期望:无法通过 telnet 重新启动路由器



我试图通过expect通过telnet连接到D-Link路由器来重新启动它。问题是我不能(通过expect脚本)执行路由器支持的任何命令。

首先,我向您展示一个与路由器的短telnet会话:

telnet 192.168.1.1
Trying 192.168.1.1...
Connected to 192.168.1.1.
Escape character is '^]'.
BCM96338 ADSL Router
Login: admin
Password: 
> swversion show
EU_3-12-01-1R00.A2pB026.d20m
> logout
Bye bye. Have a nice day!!!
Connection closed by foreign host.

现在我试图使它自动与期望脚本,但我不能使它工作。脚本如下:

#!/usr/bin/expect -f
#exp_internal 1
set timeout 30
#router username
set name admin
#command to execute
set routercmd "swversion show"
#router password
set pass mypassword
#router IP address
set routerip 192.168.1.1
spawn telnet $routerip
# send username & password
expect "Login: "
send "$namer"
expect "Password: "
send "$passr"
expect "> "
send "$routercmdr"
expect "> "

当我执行脚本时,它被卡在密码提示符:

./reboot_dut.sh 
spawn telnet 192.168.1.1
Trying 192.168.1.1...
Connected to 192.168.1.1.
Escape character is '^]'.
BCM96338 ADSL Router
Login: admin
Password: 

如果我取消注释#exp_internal 1行,我得到:

./reboot_dut.sh 
spawn telnet 192.168.1.1
parent: waiting for sync byte
parent: telling child to go ahead
parent: now unsynchronized from child
spawn: returns {6398}
expect: does "" (spawn_id exp7) match glob pattern "Login: "? no
Trying 192.168.1.1...
expect: does "Trying 192.168.1.1..." (spawn_id exp7) match glob pattern "Login: "? no

expect: does "Trying 192.168.1.1...rn" (spawn_id exp7) match glob pattern "Login: "? no
Connected to 192.168.1.1.
expect: does "Trying 192.168.1.1...rnConnected to 192.168.1.1." (spawn_id exp7) match glob pattern "Login: "? no

expect: does "Trying 192.168.1.1...rnConnected to 192.168.1.1.rn" (spawn_id exp7) match glob pattern "Login: "? no
Escape character is '^]'.
expect: does "Trying 192.168.1.1...rnConnected to 192.168.1.1.rnEscape character is '^]'." (spawn_id exp7) match glob pattern "Login: "? no

expect: does "Trying 192.168.1.1...rnConnected to 192.168.1.1.rnEscape character is '^]'.rn" (spawn_id exp7) match glob pattern "Login: "? no
BCM96338 ADSL Router
expect: does "Trying 192.168.1.1...rnConnected to 192.168.1.1.rnEscape character is '^]'.rnBCM96338 ADSL Routerrn" (spawn_id exp7) match glob pattern "Login: "? no
Login: 
expect: does "Trying 192.168.1.1...rnConnected to 192.168.1.1.rnEscape character is '^]'.rnBCM96338 ADSL RouterrnLogin: " (spawn_id exp7) match glob pattern "Login: "? yes
expect: set expect_out(0,string) "Login: "
expect: set expect_out(spawn_id) "exp7"
expect: set expect_out(buffer) "Trying 192.168.1.1...rnConnected to 192.168.1.1.rnEscape character is '^]'.rnBCM96338 ADSL RouterrnLogin: "
send: sending "adminr" to { exp7 }
expect: does "" (spawn_id exp7) match glob pattern "Password: "? no
a
expect: does "a" (spawn_id exp7) match glob pattern "Password: "? no
dmin
Password: 
expect: does "adminrnPassword: " (spawn_id exp7) match glob pattern "Password: "? yes
expect: set expect_out(0,string) "Password: "
expect: set expect_out(spawn_id) "exp7"
expect: set expect_out(buffer) "adminrnPassword: "
send: sending "mypasswordr" to { exp7 }
expect: does "" (spawn_id exp7) match glob pattern "> "? no
expect: timed out
send: sending "swversion showr" to { exp7 }
expect: does "" (spawn_id exp7) match glob pattern "> "? no
> swversion show
expect: does "rn> swversion showrn" (spawn_id exp7) match glob pattern "> "? yes
expect: set expect_out(0,string) "> "
expect: set expect_out(spawn_id) "exp7"
expect: set expect_out(buffer) "rn> "

解决方案:我找到了解决问题的方法。我试图重启的路由器是D-LINK 2640B。这个路由器的期望脚本是:

#!/usr/bin/expect -f
spawn telnet ROUTER_IP
match_max 10000
expect *login:*
sleep 2
send -- "USERNAMEr"
expect *assword:*
sleep 2
send -- "PASSWORDr"
expect *>*
send -- "r"
expect *>*
send -- "COMMANDr"
expect *>*
send -- "r"
expect *>*
send -- "logoutr"

我想说你需要匹配你的提示符">",而不是">"(即后面没有空格)。

最新更新