pexpect не удается сопоставить команду, если она превышает 65 символов.

Вопрос или проблема

Проблема с pexpect, модулем Python.

Pexpect не выполняет ожидаемое поведение, если длина команды превышает 65.

#!/usr/bin/python
import pexpect

sshCmd='ssh [email protected]'
prompt="[root@user ~]#"
ConnectToClient=pexpect.spawn(sshCmd)
ConnectToClient.expect('password')
ConnectToClient.send('abcd')
ConnectToClient.expect(prompt)
ConnectToClient.send('echo abcdefghijklmnopqrst111111111111111111111111111111111111111111111111111111111 ')
ConnectToClient.expect(prompt) ---> PASS
command = 'echo abcdefghijklmnopqrst111111111111111111111111111111111111111111111111111111111'
ConnectToClient.expect(command, prompt) 

В процессе ожидания “:”, команда (.*) приглашение —> НЕУДАЧА происходит, если длина команды превышает 65.

expect_str = "%s(.*)%s" % (command, self._default_prompt)    

В вашей программе две ошибки. Последняя строка является некорректной:

ConnectToClient.expect(command, prompt) 

это недействительно, так как expect принимает в качестве второго аргумента число таймаута, а не строку.

Другая проблема заключается в вызове:

ConnectToClient.expect(prompt)

prompt должен быть регулярным выражением (regex). Вы предоставляете строку, которая будет скомпилирована в regex. Однако, в regex символ [ является специальным, поэтому вам нужно экранировать его. Либо установите

prompt = r'\[root@user ~\]#'

или вместо использования .expect() используйте .expect_exact(), который ожидает строки, а не regex.

По умолчанию размер окна pexpect установлен на (24 строки и 80 столбцов).
В моем случае, когда длина приглашения и команды превышает 80, я сталкиваюсь с этой проблемой.
При изменении setwinsize(24,80) на setwinsize(24,150), все работает хорошо.

.

Ответ или решение

Решение проблемы с Pexpect в Python: Команда более 65 символов

Вопрос о том, как эффективно использовать модуль Pexpect в Python для выполнения команд через SSH, особенно актуален для специалистов в области ИТ. Проблема заключается в неожиданном поведении Pexpect при работе с командами, длина которых превышает 65 символов. Рассмотрим данную ситуацию подробнее и предложим решения.

Основные проблемы

  1. Неправильный вызов метода expect:

    Проблема заключается в использовании следующей строки:

    ConnectToClient.expect(command, prompt)

    Метод expect() в Pexpect ожидает вторым аргументом число, означающее тайм-аут, а не строку. Для ожидания конкретной строки, такой как prompt, следует использовать метод expect() с регулярным выражением или воспользоваться методом expect_exact().

  2. Специальные символы в регулярных выражениях:

    Аргумент prompt должен быть корректно преобразован в регулярное выражение. Символы, такие как [, являются специальными в регулярных выражениях и требуют экранирования. Поэтому строка должна выглядеть так:

    prompt = r'\[root@user ~\]#'

    Или используйте метод expect_exact() для работы с простыми строками.

Увеличение размера окна для решения проблемы

По умолчанию, Pexpect устанавливает размер окна в 24 строки и 80 столбцов. При превышении этой длины могут возникать проблемы. Решение заключается в увеличении размера окна с помощью метода setwinsize(). Для успешной обработки длинных команд измените размер окна:

ConnectToClient.setwinsize(24, 150)

Это позволяет Pexpect корректно воспринять команду и ожидаемый вывод, который превышает стандартный размер терминала.

Заключение

Учитывая специфику Pexpect, рекомендуется внимательно подходить к построению регулярных выражений и настройке окружения, в котором эти выражения исполняются. Проверка и корректировка параметров, таких как размер окна, может существенно повлиять на успешное выполнение скриптов.

Резюме

При работе с Pexpect и длинными командами важно учитывать следующие моменты:

  • Правильное использование методов expect() и expect_exact().
  • Экранирование специальных символов в регулярных выражениях.
  • Настройка параметров окружения, таких как размер окна терминала, для предотвращения некорректной обработки данных.

Полное понимание этих аспектов поможет избежать неожиданных проблем и эффективно автоматизировать SSH-сессии с использованием Python.

Оцените материал
Добавить комментарий

Капча загружается...