TCL / Expect Scripting - использование условного оператора для попытки ввода вторичного пароля для входа

Я очень близок к завершению приложения TCL/TK, которое подключается к точке доступа Cisco через последовательное соединение (RS232} и дает ему IP-адрес (очень простой)

Тем не менее, я хотел бы, чтобы мой сценарий попытался использовать дополнительный пароль, если первый не удастся

Вот как Cisco CLI ведет себя с последовательным соединением, когда неверный пароль вводится 3 раза (имя пользователя не требуется, запрашивается только пароль)

Password:
Password:
Password:
% Bad secrets

Опять же, если пароль по умолчанию "Cisco" не работает, мне нужен скрипт, чтобы попробовать дополнительный пароль "Cisco2"

Вот моя последняя неудачная попытка решить эту проблему.

    expect "*>" {send "en\r"}

    expect {
    "Password:" {send "Cisco\r"; exp_continue}
    "Password:" {send "Cisco2\r"; exp_continue}
    }

    expect "*#" {send "config t\r"}

Заранее спасибо за помощь.

1 ответ

Решение

Самый простой способ - это создать список паролей, которые вы должны попробовать:

set passwords {"Cisco" "Cisco2"}
set idx 0
expect "*>"
send "en\r"
expect {
   "Password:" {
      send "[lindex $passwords $idx]\r"
      incr idx
      exp_continue;   # Continue to wait for the "after" prompt
   }
   "*#" {send "config t\r"}
}

Хитрость в том, что вы должны также expect то, что следует, чтобы вы не использовали тайм-ауты и тому подобное. (Ну, при условии, что вы не хотите тайм-ауты. Если вы хотите, идите прямо сейчас!) Это потому, что expect ожидает все свои предложения о совпадении одновременно. В вашем глючном коде у вас было два предложения с одинаковым текстом соответствия, поэтому он всегда выбирал первое из них (IIRC, если в текущей точке совпадают несколько предложений, выбирается первая возможная ветвь).

Другие вопросы по тегам