Как автоматизировать интерактивные команды оболочки с помощью модуля Python pexpect

Я пытаюсь автоматизировать настройку приложения, выполняя SSH на машине и переходя в папку /var/packages и выполняя скрипт. Когда установка запускает набор интерактивных команд для отправки на основе ожидаемого вывода. Я нашел из Google что pexpect может добиться этого, но я не могу добиться желаемого результата. Я пытаюсь следовать коду, может ли кто-нибудь помочь мне, как этого добиться, поскольку я новичок в python. Любая помощь будет оценена по достоинству. Настройка моего приложения будет выглядеть так

[root@bits packages]# ./SHR_setup.bin -i console
    Preparing to install...
    Extracting the JRE from the installer archive...
    Unpacking the JRE...
    Extracting the installation resources from the installer archive...
    Configuring the installer for this system's environment...

    Launching installer...

    ===============================================================================
    Choose Locale...
    ----------------

        1- Deutsch
      ->2- English
        3- Español
        4- Français
        5- Italiano
        6- Nederlands
        7- Português  (Brasil)

    CHOOSE LOCALE BY NUMBER: 2
    I accept the terms of the License Agreement (Y/N): Y
    Please hit Enter to continue:

Код Python

from pexpect import pxssh
import pexpect

    try:
        s = pxssh.pxssh()
        hostname = '10.110.40.20'
        username = 'admin'
        password = 'admin123'
        s.login(hostname, username, password)
        s.sendline('cd /var/packages')   # goto /var/packages folder
        child = pexpect.spawn('./SHR_setup.bin -i console')  # start the application setup in packages folder
        child.expect('CHOOSE LOCALE BY NUMBER')   # expect output like this 
        child.sendline('2')   
        s.prompt()
        print s.before
    except pxssh.ExceptionPxssh, e:
        print 'pxssh failed on login'
        print e

person Auto-learner    schedule 30.08.2017    source источник


Ответы (2)


Вы должны изменить

s.sendline('cd /var/packages')
child = pexpect.spawn('./SHR_setup.bin -i console')

to

s.sendline('cd /var/packages')
s.sendline('./SHR_setup.bin -i console')

spawn должен запускать программу на локальном хосте, а не на удаленном хосте.

person pynexj    schedule 31.08.2017

Вы на правильном пути, используя журнал s.before для отладки.

Приложение, с которым вы взаимодействуете, больше ориентировано на экран, чем на строку, что может вызвать некоторые трудности, включая управляющие последовательности ANSI для цвета и положения. Рассмотрите возможность запуска child.expect('Something else'), некоторой строки, которая действительно надежно отображается в before, затем выполните короткую sleep(), затем просто "вслепую" отправьте "2" или "y" или что-то еще, делая короткую паузу между отправками.

person J_H    schedule 30.08.2017
comment
@J H спасибо за ваш ответ, я попробую. Я получаю следующую ошибку, когда используется pexpect.spawn('/var/packages/SHR_setup.bin -i console'). pexpect.ExceptionPexpect: The command was not found or was not executable: /var/packages/SHR_setup.bin -i console. Не могли бы вы помочь мне, какую ошибку я делаю? - person Auto-learner; 30.08.2017