Ожидайте: ^ не работает в регулярном выражении, описывающем командную строку различных устройств Cisco - PullRequest
0 голосов
/ 20 февраля 2019

В настоящее время я оптимизирую ожидаемый сценарий для сбора информации с различных типов устройств Cisco и имею проблему с отдыхом в области регулярных выражений.Большое спасибо за вашу любезную помощь заранее.

Справочная информация / проблема: устройства Cisco Nexus используют «#» и «#» в выводе команды, что влияет на логику сценария, которая использует те же символы для распознавания командной строки перед отправкойследующая команда.

Я мог бы решить большинство проблем, используя это более конкретное определение командной строки:

set prompt {([A-Z,a-z,0-9]+)(%|#|>|\\$)[\\ ]?$}

и затем в сценарии:

expect -re $prompt
send "$cmd\r"

Теперь яЯ хотел сделать это регулярное выражение еще более конкретным: «Начало строки, затем подсказка», добавив символ «^» в начале регулярного выражения, но это не удалось, и сценарий всегда запускается по таймауту перед отправкой следующего cmd.

set prompt {(^[A-Z,a-z,0-9]+)(%|#|>|\\$)[\\ ]?$}

это также не удается

set prompt {^([A-Z,a-z,0-9]+)(%|#|>|\\$)[\\ ]?$}

В журнале я вижу, что к командной строке добавляется CR (^ M, 0x0d).

Еще большеЛюбопытно, что это все еще работает без истечения времени ожидания, так что да, перед приглашением Cisco CLI есть CR:

set prompt {[\x0d]([A-Z,a-z,0-9]+)(%|#|>|\\$)[\\ ]?$}

Но не при использовании «^»

set prompt {^[\x0d]([A-Z,a-z,0-9]+)(%|#|>|\\$)[\\ ]?$}

Когдаиспользуя меньше, чтобы просмотреть файл журнала, я вижу это:

^MDevice123# term len 0^M
^MDevice123# show inventory^M

Hexdump показывает между концом строки и новой строкой с приглашением:

0d 0d 0a 0d (CR CR LF CR)

Любая подсказка, что происходит с моимцель, чтобы сделать регулярное выражение для командной строки более конкретным, описав приглашение от начала до конца строки?

1 Ответ

0 голосов
/ 20 февраля 2019

^ будет соответствовать началу буфера , а не только началу строки.

Поскольку ожидание построено на Tcl, вы можете использовать Синтаксис регулярного выражения Tcl означает, что вы хотите, чтобы ^ соответствовал пустой строке после любой новой строки:

set prompt {(?n)^[[:alnum:]]+[%#>$]\s?$}
# ..........^^^^

Примечания:

  • в выражении в скобках, использование запятой означает, что выхочу также поставить запятую.Вместо [A-Z,a-z,0-9] вы хотите, чтобы [A-Za-z0-9] соответствовал буквам или цифрам, или используйте класс символов, как показано выше.
  • Я подозреваю, что вам не нужно захватывать биты, заключенные в скобки.

Расширение до последней точки, когда вы делаете это:

set prompt {([A-Za-z0-9]+)(%|#|>|\\$)[\\ ]?$}
expect -re $prompt

Предположим, что пока он работает как задумано.Предположим также, что ваше приглашение выглядит следующим образом:

myHostname1234>

После expect, ожидайте, будет сохранять захваченные части регулярного выражения в массиве expect_out:

  • $expect_out(0,string) будет содержать текст, соответствующий регулярному выражению
  • $expect_out(1,string) будет содержать буквы и цифры, захваченные "([A-Za-z0-9] +)", в данном случае "myHostname1234"
  • $expect_out(2,string) будет содержать символ приглашения, захваченный символом «(% | # |> | \ $)», в данном случае «>»

Я подозреваю, что вы не используете expect_out переменная в вашем коде, поэтому не нужно ожидать, что вы захотите сохранить сопоставленный текст.Я подозреваю, что вам действительно все равно, что за подсказка.

Я знаю, что скобки необходимы для группировки частей регулярного выражения.Однако, если вам не нужно запоминать сопоставленный текст, вы можете использовать (?:subpattern), чтобы получить поведение группировки без поведения запоминания.

Массив expect_out содержит и другие вещи.Прочитайте справочную страницу ожидающих всех деталей.

...