Я пишу сценарий с expect
для автоматической настройки маршрутизаторов Cisco через ssh
. Часть этого скрипта - скопировать изображение в flash
если его не существует:
Для этого ожидать отправляет copy
и ждет Destination filename
затем отправляет return
.
cisco#copy tftp://10.xx.xx.3/name_of_image.bin flash:
Destination filename [name_of_image.bin]?
Теперь есть два варианта:
flash:
Если файл уже существует, он выглядит так:
%Warning:There is a file already existing with this name
Do you want to over write? [confirm]
Теперь к моей проблеме: скрипты ждут Do you want to over write? [confirm]
а затем должен выйти, поскольку изображение уже мигает. Но в настоящее время кажется, что expect
не может распознать эту строку и застревает на подтверждении. Он пробовал несколько шаблонов, например [confirm]
, *[confirm]*
, Do
, *write*
и еще кое-что.
Мой код для этой работы сейчас выглядит так:
expect "*#"
send "copy tftp://10.$ip_local.3/name_of_image.bin flash:\r"
expect "Destination filename"
send "\r"
expect {
"Do you want to over write? [confirm]"{
interact
abort
}
expect "*#"
send "exit\r"
Что я делаю не так?
Пара ошибок:
[confirm]
попытается вызвать команду expect "confirm" - квадратные скобки в expect похожи на обратные кавычки в оболочкеexpect
команда, в которой побеждает первая совпавшая команда.Попробуй это:
expect {
-exact {Do you want to over write? [confirm]} {
send "\r"
exp_continue
}
"*#"
}
send "exit\r"
expect eof
Ноты
?
и [...]
это будет мешать.[confirm]
от попытки подмены командыexp_continue
оставаться в пределах этой ожидаемой команды, если появится запрос на перезапись. Это означает, что я все еще могу искать командную строку.exit
, ждать eof
чтобы позволить сеансу ssh нормально завершиться