Вопрос или проблема
У меня проблема с моим скриптом. Похоже, мой пароль неверен.
#!/usr/bin/expect
set ip [lindex $argv 0]
spawn telnet $ip
set timeout 10
expect "Login:"
send "administrator\r"
expect "Password:"
send "123456"
send "\r"
Он говорит, login incorrect
. Но это работает, когда я использую cmd
в Windows для telnet к моему телефону, это работает с “administrator” и 123456 в качестве пароля. Я не знаю, почему в моем скрипте я не смог войти успешно.
Мне нужно использовать этот скрипт для снижения/повышения версии моих телефонов.
Я нашел ответ. Мне просто нужно вставить команду
sleep
перед
expect "Login:"
Спасибо всем.
Ответ или решение
Для успешной автоматизации сеанса telnet с использованием скрипта на языке Expect вам необходимо учесть некоторые технические детали, чтобы избежать ошибок при вводе имени пользователя и пароля. Давайте разберем ваш скрипт и добавим необходимые улучшения.
Исходный код вашего скрипта выглядит следующим образом:
#!/usr/bin/expect
set ip [lindex $argv 0]
spawn telnet $ip
set timeout 10
expect "Login:"
send "administrator\r"
expect "Password:"
send "123456"
send "\r"
Проблема, с которой вы столкнулись, связана с тем, что время ожидания между переменными значениями, такими как "Login" и "Password", может быть недостаточным. Это может привести к тому, что скрипт попытается отправить имя пользователя и пароль слишком быстро, прежде чем система успеет предоставить нужный ввод.
Улучшенная версия скрипта
Для решения данной проблемы вам необходимо добавить команду sleep
перед первой командой expect
, чтобы дать системе время для генерации вывода. Вот обновленная версия вашего скрипта:
#!/usr/bin/expect
# Установите IP-адрес из аргументов командной строки
set ip [lindex $argv 0]
# Запускаем telnet с указанным IP-адресом
spawn telnet $ip
# Устанавливаем таймаут
set timeout 10
# Ждем немного перед ожиданием вывода "Login:"
sleep 1
# Ожидаем появления строки "Login:"
expect "Login:"
# Отправляем имя пользователя
send "administrator\r"
# Ожидаем появления строки "Password:"
expect "Password:"
# Отправляем пароль
send "123456\r"
# Ожидаем, что скрипт завершится
expect eof
Объяснение ключевых изменений:
-
Команда
sleep
: Добавивsleep 1
перед ожиданием строки "Login:", вы предоставляете системе время для полной инициализации и вывода запрашиваемого сообщения. Таким образом, вероятность возникновения ошибки "login incorrect" снижается. -
Таймаут: Переменная
set timeout 10
отвечает за максимальное время ожидания, в течение которого скрипт будет дожидаться появления запрашиваемой строки. Убедитесь, что время достаточно для вашего устройства. -
Использование
expect eof
: В конце добавлениеexpect eof
делает скрипт более устойчивым, ожидая завершения работы telnet и предотвращая неожиданные ошибки.
Заключение
Убедитесь, что ваш телефон (или устройство) действительно доступен по сети и принимает telnet-настройки. Это важный шаг в процессе устранения неполадок. Также проверьте, что введенные вами имя пользователя и пароль корректны.
Если вы выполните все указанные шаги, ваш скрипт будет работать корректно и поможет в процессе обновления или понижения версии прошивки на вашем устройстве. Обращайтесь за помощью, если возникнут дополнительные вопросы!