Вопрос или проблема
Проблема с 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 символов. Рассмотрим данную ситуацию подробнее и предложим решения.
Основные проблемы
-
Неправильный вызов метода
expect
:Проблема заключается в использовании следующей строки:
ConnectToClient.expect(command, prompt)
Метод
expect()
в Pexpect ожидает вторым аргументом число, означающее тайм-аут, а не строку. Для ожидания конкретной строки, такой какprompt
, следует использовать методexpect()
с регулярным выражением или воспользоваться методомexpect_exact()
. -
Специальные символы в регулярных выражениях:
Аргумент
prompt
должен быть корректно преобразован в регулярное выражение. Символы, такие как[
, являются специальными в регулярных выражениях и требуют экранирования. Поэтому строка должна выглядеть так:prompt = r'\[root@user ~\]#'
Или используйте метод
expect_exact()
для работы с простыми строками.
Увеличение размера окна для решения проблемы
По умолчанию, Pexpect устанавливает размер окна в 24 строки и 80 столбцов. При превышении этой длины могут возникать проблемы. Решение заключается в увеличении размера окна с помощью метода setwinsize()
. Для успешной обработки длинных команд измените размер окна:
ConnectToClient.setwinsize(24, 150)
Это позволяет Pexpect корректно воспринять команду и ожидаемый вывод, который превышает стандартный размер терминала.
Заключение
Учитывая специфику Pexpect, рекомендуется внимательно подходить к построению регулярных выражений и настройке окружения, в котором эти выражения исполняются. Проверка и корректировка параметров, таких как размер окна, может существенно повлиять на успешное выполнение скриптов.
Резюме
При работе с Pexpect и длинными командами важно учитывать следующие моменты:
- Правильное использование методов
expect()
иexpect_exact()
. - Экранирование специальных символов в регулярных выражениях.
- Настройка параметров окружения, таких как размер окна терминала, для предотвращения некорректной обработки данных.
Полное понимание этих аспектов поможет избежать неожиданных проблем и эффективно автоматизировать SSH-сессии с использованием Python.