python中expect的作用_pexpect 模块(python expect)

pexpect模块是Python中的一个子进程控制库,主要用于自动化交互式应用,如SSH、FTP等。它通过spawn方法启动程序,expect方法等待并匹配特定关键字,send和sendline方法向程序发送输入。在expect中,可以设置超时、缓存大小和搜索窗口大小以优化性能。本文详细介绍了spawn、expect和send等关键方法的使用,以及示例展示了如何使用pexpect模拟SSH登录和执行命令。
摘要由CSDN通过智能技术生成

pexpect 模块(python expect)

2019/07/07 Chenxin

概念与流程说明

流程

1.运行程序

2.程序要求人的判断和输入

3.Expect 通过关键字匹配

4.根据关键字向程序发送符合的字符串

三个关键指令

pexpect 的使用说来说去,就是围绕3个关键命令做操作:

1.首先用 spawn 来执行一个程序

2.然后用 expect 来等待指定的关键字,这个关键字是被执行的程序打印到标准输出上面的

3.最后当发现这个关键字以后,根据关键字用 send 方法来发送字符串给这个程序

第一步只需要做一次,但在程序中会不停的循环第二、三步来一步一步的完成整个工作。

当然 pexpect 不会只有这 3 个方法,实际上还有很多外围的其他方法,我们之后来说明(见详细部分的API部分).

主要方法说明

spawn()执行程序

spawn() 方法用来执行一个程序,它返回这个程序的操作句柄,以后可以通过操作这个句柄来对这个程序进行操作.

比如:

process = pexpect.spawn('ftp sw-tftp')

spawn() 中的字符串就是要执行的程序,打开一个到 sw-tftp 服务器的 ftp 连接。

spawn() 中的第一个元素就是要执行的命令,除此之外还可以指定一些其他参数,比如: pexpect.spawn('ftp sw-tftp', timeout=60) 就指定了超时时间,这些具体的会在后面讲解。

process 就是 spawn() 程序操作句柄,之后对这个程序的所有操作都是基于这个句柄的,所以它可以说是最重要的部分。

注意: spawn() ,或者说 pexpect 并不会转译任何特殊字符, 比如 | * 字符在Linux的shell中有特殊含义,但是在 pexpect 中不会转译它们,如果在 linux 系统中想使用这些符号的正确含义就必须加上 shell 来运行,这是很容易犯的一个错误。

正确的方式:process = pexpect.spawn('/bin/bash –c "ls –l | grep LOG > log_list.txt"')

expect() - 匹配

当 spawn() 启动了一个程序并返回程序控制句柄后,就可以用 expect() 方法来等待匹配到命令的输出了。它最后会返回 0 表示匹配到了所需的关键字,如果后面的匹配关键字是一个列表的话,就会返回一个数字表示匹配到了列表中第几个关键字,从 0 开始计算。

send() - 发送字符串

send() 作为3个关键操作之一,用来向程序发送指定的字符串,比如:

process.expect("ftp>")

process.send("by\n") # 这个方法会返回发送字符的数量.

sendline() - 发送带回车符的字符串

只发送字符用send().若发送字符+回车,推荐用 sendline().它也会返回发送的字符数量.

sendcontrol() - 发送控制信号

sendcontrol() 向子程序发送控制字符.比如要向子程序发送 ctrl+G,那么就这样写:

process.sendcontrol('g')

示例说明

简单示例(SSH登陆模拟)

command = 'ssh '+username+'@'+host

child = pexpect.spawn(command)

ret = child.expect([pexpect.TIMEOUT,'Are you sure you want to continue connecting','[P|p]assword']+PROMPT)

if ret == 0:

print('[-] Error Connecting')

return

# 0 :连接超时

# 1 :ssh有时候提示你是否确认连接

# 2 :提示输入密码

if ret == 1:

child.sendline('yes')

ret = child.expect([pexpect.TIMEOUT,'[p|P]assword'])

if ret == 0:

print('[-] Error Connecting')

return

if ret == 2:

send_command(password)

return

if ret == 2:

send_command(password)

return

return child

注:针对ssh远程登录,pexpect又派生出了pxssh类,在ssh会话操作上再做一层封装.其常用方法是:

login() #建立ssh连接

logout() #断开ssh连接

prompt() #等待系统提示符,用于等待命令执行结束

在本地Macpro上测试通过的SSH模拟脚本

import pexpect

PROMPT = ['# ', '>>> ', '> ', '$ ']

PROMPT = ['#', '>>>', '>', '$'] # 提示符后不能有空格

def send_command(process, cmd):

process.sendline(cmd)

process.expect(PROMPT)

# print(process.before)

return process.before # 缓存中剩下的内容展示出去(也就是上面send的指令的结果,比如系统上执行ls -al的结果)

def connect(user, host, password):

ssh_newkey = 'Are you sure you want to continue connecting'

connStr = 'ssh ' + user + '@' + host

print('连接信息是: ', connStr)

process = pexpect.spawn(connStr, timeout=10)

print('尝试连接')

ret = process.expect([pexpect.TIMEOUT, ssh_newkey, '[P|p]assword:']) # 语法与含义就是以下

# 0 :连接超时(匹配到了pexpect.TIMEOUT)

# 1 :ssh有时候提示你是否确认连接(匹配到了ssh_newkey)

# 2 :提示输入密码(匹配到了[P|p]assword:)

# 3 :匹配到#号,表示命令已经执行完毕。没用到

print('返回值:', ret)

if ret == 0:

print('[-] Error connecting')

return

if ret == 1:

print('SSH提示确认连接吗,yes/no')

process.sendline('yes')

# if ret == 2:

# process.sendline(password)

# print('已经输入密码')

# process.expect(PROMPT)

# return process

# ret = process.expect([pexpect.TIMEOUT, ssh_newkey, '[P|p]assword:'])

# if ret == 0:

# print('[-] Error connecting')

# return

process.sendline(password)

process.expect(PROMPT)

return process

def main():

host = '127.0.0.1'

user = 'chanix'

password = 'che.....'

process = connect(user, host, password)

print(str(send_command(process, 'pwd'), 'utf-8')) # 将bytes类型转为字符串格式

print('-----')

process = connect(user, host, password)

result = send_command(process, 'cd /home;ls -al')

print(type(result))

# print(result)

string = str(result, 'utf-8') # 将bytes类型转为字符串格式

print(string)

if name == 'main':

main()

详细方法说明-API

spawn() - 执行程序

spawn() 方法用来执行一个程序,它返回这个程序的操作句柄,以后可以通过操作这个句柄来对这个程序进行操作,比如:

process = pexpect.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值