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