Ожидается скрипт для telnet-связи с маршрутизатором DLink

Ожидается скрипт для telnet-связи с маршрутизатором DLink

Я пытаюсь подключиться к своему маршрутизатору через 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"части. Он доходит до приглашения оболочки, которое выглядит как: ~ $(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автоматически сгенерировал для меня скрипт. Когда я запустил этот скрипт, он дошел до выполнения моей команды и выполнил ее в маршрутизаторе, но затем не смог выйти. Используя подсказки из этого скрипта и прочитав страницу руководства expect, я, наконец, понял, что была какая-то проблема с распознаванием шаблонов. Я, наконец, изменил скрипт соответствующим образом, и вот что в итоге работает:

#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 вернет разные выходные данные, и вам придется сопоставлять их соответствующим образом.

Связанный контент