期望與 DLink 路由器進行 telnet 通訊的腳本

期望與 DLink 路由器進行 telnet 通訊的腳本

我正在嘗試使用以下腳本透過 telnet 連接到我的路由器:

#!/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"

現在腳本可以正常工作了send -- "sh\n"。它會出現如下所示的 shell 提示符號:~ $(tilda-space-dollar-space)。但是,此後我無法發出命令。之後它基本上就不起作用了。

有人能告訴為什麼嗎?我犯了一些錯誤嗎?

答案1

好的。我破解了它。它必須在expect程式碼最後幾行的部分中對錯誤的模式匹配進行一些操作。

首先,我所做的是使用autoexpect.該工具用於記錄您的會話並基於該會話生成腳本。為此,我首先安裝了該autoexpect軟體包(在expect-dev基於 Debian 的系統上提供了軟體包),然後記錄了我的會話:

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

autoexpect自動為我產生了一個腳本。當我運行這個腳本時,它一直到執行我的命令並在路由器中執行它,但隨後無法退出。從這個腳本中得到提示並閱讀期望手冊頁,我終於發現模式識別存在一些問題。我最終相應地修改了腳本,這就是最終的效果:

#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

所以,學到的教訓是我們應該使用autoexpect自動產生腳本。如果這些自動產生的腳本出現問題,則很可能是由於該expect部分的模式識別錯誤。

就我而言,本質上有問題的部分是:

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

有問題的部分完全取決於您的會話以及您正在聯繫的人。透過 telnet 聯絡郵件伺服器將傳回不同的輸出,您必須進行相應的配對。

相關內容