Telnet Automation with Expect: медленная аутентификация? - PullRequest
3 голосов
/ 08 мая 2011

Я отправляю команду на маршрутизатор Mikrotik, используя Telnet.

telnet 192.168.100.100 -l admin
Password: pass1234
[admin@ZYMMA] > /interface pppoe-server remove [find user=aspeed13]
[admin@ZYMMA] > quit

Работает нормально.

Теперь я хочу автоматизировать его с помощью сценария ожидаемого tcl:

#!/usr/bin/expect --
spawn telnet 192.168.100.100
expect "Login:"
send "admin\r"
expect "Password:"
send "pass1234\r"
expect "\[admin@ZYMMA\] >"
send "/interface pppoe-server remove \[find user=aspeed13\]\r"
expect "\[admin@ZYMMA\] >"
send "quit\r"

Работает, но после аутентификации (строка 6: send "pass1234\r") при загрузке CLI маршрутизатора зависает на ~ 10 секунд со следующими символами ^[[?6c^[[24;3R Тогда сценарии работают нормально.

Мой вопрос: почему Telnet загружается быстро при доступе вручную, и это занимает слишком много времени при обращении через сценарий ожидаемого? Я читал на форумах об автоматизации telnet, они говорят, что telnet работает медленно, но так как вручную это слишком быстро, почему требуется время для загрузки с ожидаемым?

Ответы [ 4 ]

2 голосов
/ 09 мая 2011

То, что вы видите, является ударом от согласования терминала, потому что вы не работаете в реальном терминале. (Строго говоря, вы - это волшебство ожидаемого - но оно не ведет себя так, как обычный терминал.)

Самое простое решение - установить терминал на что-то другое, прежде чем запустить сеанс telnet, например ::

.
#!/usr/bin/expect --
set env(TERM) dumb
spawn telnet 192.168.100.100
# Rest of your script goes here ...

В качестве альтернативы, вы можете попытаться правильно ответить на запрос на вход в режим VT102 и отчет о местоположении курсора (что выглядит как большая работа), или вы можете переписать свой код, чтобы он делал все внутри interact ( который соединяет другой конец с реальным терминалом, внутри которого вы работаете). Но если установка переменной среды исправляет это, зачем переходить ко всем этим дополнительным хлопотам?

(NB: я предлагаю установить терминал на dumb здесь, но ключ в том, что вы хотите, чтобы самый глупый терминал работал. Глухие терминалы идеальны, потому что они примерно полностью глупо, чтобы было легко притвориться им ...)

1 голос
/ 20 мая 2014

Мой ответ, возможно, слишком поздно.Это «команда Telnet autoconfig» ... Я столкнулся с этой проблемой и нашел в Mikrotik Wiki такое решение:

Добавить + t после имени для входа.Этот переключатель автоматически обнаруживает выключение.

Пример: отправьте "admin + t \ r"

Это прекрасно работает, а не "подождите приблизительно 10 секунд" после входа в систему по ожидаемым.* Есть ссылка на справку Mikrotik WiKi с другими «переключателями»: http://wiki.mikrotik.com/wiki/Manual:Console_login_process#FAQ

PS: Извините за мой английский.

1 голос
/ 17 февраля 2013

Немного поздно, чтобы ответить.
Но если вы хотите ускорить ввод вашего символа с ожидаемым ожиданием.
Попробуйте сгенерировать скрипт с помощью команды "autoexpect", которая сохранит взаимодействие
вфайл с именем «script.exp» в том же каталоге, из которого
вы выполнили команду.

Например:
cd $ HOME
autoexpect telnet 192.168.100.100
# здесь есть еще несколько команд telnet
exit

Все вышеперечисленные команды будут сохранены в ~ / script.exp
О Tcl, я не знаю, можно ли запустить этот скрипт черезTCL.

1 голос
/ 08 мая 2011

Вы пробовали с netcat, с включенной эмуляцией telnet?

...