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