如何使用Python pexpect模块自动化shell交互命令

时间:2017-08-30 18:09:29

标签: python pexpect

我正在尝试通过对机器和goto / var / packages文件夹执行SSH来自动设置应用程序并执行脚本。当安装启动一组基于预期输出发送的交互式命令时。从谷歌发现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

2 个答案:

答案 0 :(得分:0)

您正在使用s.before日志进行调试。

您正在与之交互的应用程序似乎更多面向屏幕,这可能会带来一些困难,包括颜色和位置的ANSI转义序列。考虑运行child.expect('Something else'),某些字符串 可靠地显示在before中,然后做一个简短的sleep(),然后只是"盲目地"发送" 2"或" y"或者其他什么,在发送之间暂停。

答案 1 :(得分:0)

你应该改变

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

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

spawn应该在本地主机上运行程序,而不是在远程主机上运行。