Может ли 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 re соответствует только буквам из слова
  • Два очень близких регулярных выражения с утверждениями в Python - почему re.split () ведет себя по-другому?
  • python reg ex включить отсутствующие запятые
  • Регулярное выражение Python, соответствующее свойствам Unicode
  • Разложение HTML для ссылки на текст и цель
  • Как использовать str.replace на рисунках на TLE, а затем найти совпадение с TLE?
  • Сплит с одиночным двоеточием, но не двойной двоеточие с использованием регулярного выражения
  • Откройте одинаково смежные строки с регулярным выражением и python
  •  
    Interesting Posts for Van-Lav

    Получить физическое местоположение карты объекта, основанного на пользовательском вводе

    Какие языки программирования можно использовать на Android Dalvik?

    Pandas – события, связанные друг с другом

    фотографирование веб-камеры в python 3 и windows

    Простой апплет панели Gnome в Python

    Регулировка экспозиции (яркость / контрастность) на основе гистограммы с использованием Python

    как сортировать по вычисленному значению в django

    Несколько кодов try в одном блоке

    Когда модуль python (cairo) установлен успешно, но не может импортироваться в python, в чем проблема?

    Захват вывода скрипта python выполняется внутри контейнера докеров

    конвертировать кортежные ключи dict в новый dict

    Как использовать AND в Django-фильтре?

    Является ли короткое замыкание поведения Python на все / все?

    Как определить, использует ли тензорный поток ускорение gpu изнутри оболочки python?

    python выбирает определенные элементы из списка

    Python - лучший язык программирования в мире.