Назад | Перейти на главную страницу

Expect не распознает вывод на маршрутизаторе Cisco

Я пишу сценарий с 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]?

Теперь есть два варианта:

  1. Файл не существует и копируется в flash:
  2. Файл существует, и сценарий пропускает эту часть.

Если файл уже существует, он выглядит так:

%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

Ноты

  • Я использую "точное" соответствие, так как у вас есть подстановочные знаки glob ? и [...] это будет мешать.
  • Я использую кавычки без интерполяции (фигурные скобки), чтобы предотвратить [confirm] от попытки подмены команды
  • Я жду либо приглашение перезаписать или командная строка
  • я использую exp_continue оставаться в пределах этой ожидаемой команды, если появится запрос на перезапись. Это означает, что я все еще могу искать командную строку.
  • приведенные выше 2 пункта описывают, как реализовать условное сопоставление.
  • Я предполагаю, что вы просто хотите нажать Enter при запросе перезаписи.
  • после тебя exit, ждать eof чтобы позволить сеансу ssh нормально завершиться