Может ли pexpect сказать, чтобы игнорировать шаблон или сигнал?

Я пытаюсь написать скрипт python для доступа к нескольким сетевым устройствам Cisco. К сожалению, устройства не настроены одинаково, у некоторых есть баннеры, которые появляются в странных местах. Эти баннеры могут иметь шаблоны, которые имеют некоторые из тех же материалов, которые могут иметь подсказки.

Например, как только я вхожу в систему, я ожидаю приглашение 'hostname#' , поэтому я в основном использую pexpect('#') мне, возможно, придется обрабатывать некоторые другие приглашения, такие как 'hostname>' а также pexpect('>') работает. У меня действительно есть список возможных подсказок, плюс тайм-аут и действовать соответственно.

Это нормально, если в центре где-то не появляется баннер. Например, после входа в баннер может появиться сообщение ## Welcome ## и быть там перед приглашением. Я считаю, что если бы я мог сказать pexpect игнорировать регулярное выражение #.*\r будет в порядке, но я не уверен, что это возможно. Возможно ли, что pexpect игнорирует строку, или есть лучший способ сделать это?

3 Solutions collect form web for “Может ли pexpect сказать, чтобы игнорировать шаблон или сигнал?”

Решение, которое я использовал для использования в дни BBS, заключалось в поиске приглашения, а затем сразу после того, как я получил его, найдите разрыв строки или пробел с тайм-аутом секунды или двух. Если второе ожидание закончилось, это означало, что я ожидал подсказки. Поскольку pexpect использует регулярные выражения, на самом деле вы можете проверить, получаете ли вы символ в течение секунды после подсказки.

 def wait_for_prompt(session, prompt, timeout=1): gotprompt = 0 while not gotprompt: session.expect(prompt, timeout=None) gotprompt = session.expect([".", pexpect.TIMEOUT], timeout=timeout) child = pexpect.spawn("ssh ...") wait_for_prompt(child, "[#>]") 

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

Модуль pexon python ожидает согласования ввода. Вы не можете игнорировать входные данные, за исключением создания регулярных выражений, которые не будут соответствовать неоднозначным или нежелательным вводам. Однако, вместо создания одного очень сложного регулярного выражения, pexpect также может обрабатывать списки регулярных выражений . Затем вы закрепляете эти регулярные выражения, чтобы уменьшить двусмысленность.

Например, вы можете легко различать командную строку и баннер, привязывая соответствие к началу или концу строки и делая совпадение максимально точным:

 users = ['fred', 'ginger'] user_prompt = '^(?:%s)@.*?\$ $' % '|'.join(users) child.expect (['hostname# $', 'hostname> $', user_prompt]) 

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

Как только ожидание найдет совпадение, он устанавливает атрибуты «раньше», «после» и «матч» в экземпляре процесса. Вы можете использовать их для написания некоторой логики.

Кроме того, вы можете просто создать лучшее регулярное выражение, которое соответствует только приглашению. Даже r '> $ | # $', вероятно, будет делать то, что вы хотите, поскольку оно будет только соответствовать этим символам в конце строки.

  • Сортировка буквенно-цифровых клавиш словаря в python
  • Разделение списка имен, где может быть общее имя для двух первых имен
  • Регулярное выражение Python, соответствующее свойствам Unicode
  • Python strip XML-теги из документа
  • Эквивалентен методу findall () Python в Ruby?
  • Как сравнить версии Rpm в python
  • Несоответствие между регулярными выражениями sed и python
  • Регулярное выражение Python для разбора HTML (BeautifulSoup)
  • Python - лучший язык программирования в мире.