Ожидайте сценарий для связи 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" часть. Он попадает в командную строку, которая выглядит так: ~ $ (Тильда-космос-доллар-пространство). Однако я не могу выполнить команду после этого. Это в основном просто не работает после этого.

Кто-нибудь может сказать почему? Это какая-то ошибка, которую я делаю?

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 вернет разные результаты, и вы должны будете соответствовать соответственно.

Другие вопросы по тегам