computer_knowledge_notes/Languages/Python3/library/pexpect.md

2.2 KiB
Raw Blame History

参考文档

码道仕(知乎)Python模块Pexpect详解

简介

expect是一个程序,可以通过脚本和其它程序交互。pexpect模块是用python实现了expect程序的功能。

pexpect的基本工作流程:

  1. spawn执行一个程序。
  2. expect等待关键字。
  3. 当匹配到关键字,用send/sendline给程序发信息。

spawn类

pexpect.spawn(cmd,...)	# 执行cmd命令
    # timeout=<TIMEOUT> : 单位为秒用于引发expect()超时。默认30。如为Noneexpect()有可能一直阻塞直到匹配。
    # encoding=<ENCODING>	// python3需要向spawn传递此参数
	# 返回值cmd的handle

#== 成员 ==
logfile		# 指定日志文件。如设置为sys.stdout则输出到stdout。如设置为None则不输出日志。默认为None。

#== 方法 ==
expect(pattern,...)	# 等待pattern配置stream。

expect()方法

send()/sendline()方法

interact()方法

示例

#!/usr/bin/env python3.6
#-*- coding:utf-8 -*-

import pexpect

def main(server):
    command = 'ssh -p %s %s@%s' % (server['port'], server['username'], server['hostname'])
    process = pexpect.spawn(command, timeout=30)
    print(f'命令: {command}')
    expect_list = [
        'yes/no',
        'password:',
        pexpect.EOF,
        pexpect.TIMEOUT,
    ]
    index = process.expect(expect_list)
    print(f'匹配到: {index} => {expect_list[index]}')
    if index == 0: 
        process.sendline("yes")
        expect_list = [
            'password:',
            pexpect.EOF,
            pexpect.TIMEOUT,
        ]
        index = process.expect(expect_list)
        print(f'匹配到: {index} => {expect_list[index]}')
        if index == 0:
            process.sendline(server['password'])
            process.interact()
        else:
            print('EOF or TIMEOUT')
    elif index == 1:
        process.sendline(server['password'])
        process.interact()
    else:
        print('EOF or TIMEOUT')

if __name__ == '__main__':
    server = {
        'hostname': '192.168.1.100',
        'port': '22',
        'username': 'admin',
        'password': 'ABuklhsfnVyxI',
    }
    main(server)