Я пытаюсь создать простой сценарий подключения telnet. Я запускаю telnet-процесс. В зависимости от версии он может запрашивать или не запрашивать пароль.
После этого он запрашивает имя пользователя и пароль и принятие правил. После успешного входа в систему он запрашивает команду.
Однако то, что я написал, не работает.
#/usr/bin/expect -f
set IP [lindex $argv 0]
set timeout 10
set send_slow {10 .5}
log_user 1
spawn telnet -l cli $IP
expect {
timeout {
puts "Network Connection Problem"
close
}
"Password:" {
send -s -- "cli\r"
exp_continue
}
"Username:" {
send -s -- "admin\r"
expect "Password:"
send -s -- "admin\r"
exp_continue
}
"(Y/N)?" {
send -s -- "Y\r"
exp_continue
}
}
expect "# "
send -s -- "show version\r"
После запуска скрипта я прохожу логин и соглашаюсь. После отображения приглашения сценарий не выполняет команду show version. Курсор мигает через несколько секунд я вижу информацию:
expect: spawn id exp6 not open while executing "expect "# ""
Может кто-нибудь исправить мои ошибки? Я прочитал руководство по ожиданию, просмотрел примерные сценарии, но не смог найти никакого решения. Я уверен, что это просто, но я здесь борюсь.
Помогите мне, капитан.





У вас есть заявление здесь
spawn telnet -l cli $IP
который определяет имя пользователя как cli для сеанса telnet. Таким образом, код для входа в систему как admin никогда не будет достигнут.
Приглашение оболочки по умолчанию для администратора:
'# '
Приглашение оболочки по умолчанию для cli:
'$ '
измените свой код, чтобы он обрабатывал поиск любого приглашения оболочки.
Вам понадобится хотя бы одна ветвь в этой команде expect, которая выполняет нет "exp_continue": поместите шаблон для приглашения в качестве последнего шаблона в команде expect без каких-либо действий: когда ожидание увидит приглашение, команда expect завершится, и сценарий может продолжать.
expect {
timeout {
puts "Network Connection Problem"
close
exit ;# if you don't exit, your next command is "send" which will fail
}
"Password:" {
send -s -- "cli\r"
exp_continue
}
"Username:" {
send -s -- "admin\r"
expect "Password:"
send -s -- "admin\r"
exp_continue
}
"(Y/N)?" {
send -s -- "Y\r"
exp_continue
}
"# "
}
send -s -- "show version\r"