Pexpect 是 Expect 语言的一个 Python 实现,是一个用来启动子程序,并使用正则表达式对程序输出做出特定响应,以此实现与其自动交互的 Python 模块。 Pexpect 的使用范围很广,可以用来实现与 ssh、ftp 、telnet 等程序的自动交互;可以用来自动复制软件安装包并在不同机器自动安装;还可以用来实现软件测试中与命令行交互的自动化。

整体来说大致的流程包括:

运行程序

程序要求人的判断和输入

Expect 通过关键字匹配

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

基本使用流程

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

首先用 spawn 来执行一个程序

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

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

第一步只需要做一次,但在程序中会不停的循环第二、三步来一步一步的完成整个工作。掌握这个概念之后 pexpect 的使用就很容易了。当然 pexpect 不会只有这 3 个方法,实际上还有很多外围的其他方法,

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() - 发送带回车符的字符串

sendline() 和 send() 唯一的区别就是在发送的字符串后面加上了回车换行符,这也使它们用在了不同的地方:

只需要发送字符就可以的话用send()

如果发送字符后还要回车的话,就用 sendline()

它也会返回发送的字符数量

sendcontrol() - 发送控制信号

sendcontrol() 向子程序发送控制字符,比如 ctrl+C 或者 ctrl+D 之类的,比如你要向子程序发送 ctrl+G,那么就这样写:

process.sendcontrol('g')

简单实例:

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

if ret == 1:

child.sendline('yes')

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

if ret == 0:

print('[-] Error Connecting')

return

if ret == 1:

send_command(password)

return

if ret == 2:

send_command(password)

return

return child

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

其常用方法是:

login() #建立ssh连接

logout() #断开ssh连接

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

以上这篇python之pexpect实现自动交互的例子就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持脚本之家。

python send 案例_python之pexpect实现自动交互的例子相关推荐

  1. python send 案例_python socket编程入门(编写server实例)+send 与sendall的区别与使用方法...

    python 编写server的步骤: 1. 第一步是创建socket对象.调用socket构造函数.如: socket = socket.socket( family, type ) family参 ...

  2. python send 案例_python使用rabbitmq实例三,交换机

    上面一篇是说到了工作队列,每次消息都只会发送给其中一个接收端,如果需要将消息广播出去,让每个接收端都能收到,那么就要使用交换机. 交换机的工作原理:消息发送端先将消息发送给交换机,交换机再将消息发送到 ...

  3. python pp模块_Python模块--Pexpect

    探索 Pexpect,第 1 部分:剖析 Pexpect 概述 Pexpect 是 Don Libes 的 Expect 语言的一个 Python 实现,是一个用来启动子程序,并使用正则表达式对程序输 ...

  4. python 使用pexpect实现自动交互示例

    Pexpect 是一个用来启动子程序并对其进行自动控制的 Python 模块,它可以用来和像 ssh.ftp.passwd.telnet 等命令行程序进行自动交互. shell 命令expect使用  ...

  5. python之pexpect实现自动交互

    Pexpect 是 Expect 语言的一个 Python 实现,是一个用来启动子程序,并使用正则表达式对程序输出做出特定响应,以此实现与其自动交互的 Python 模块. Pexpect 的使用范围 ...

  6. python 连续矫正_Python实现系统时间自动校正 | 学步园

    最近由于台式机CMOS电池没电了,每次开机后系统时间都会被初始化.出于每次都要重新设置系统时间太麻烦的考虑,今天用Python实现了系统开机自动校正时间的程序.大致的思路是:首先产生一个windows ...

  7. python建筑案例_Python数据分析实战-链家北京二手房价分析

    前言 最近在自学Python,通过学习大家的分享案例,看到使用Python进行较多的主要4个方面:爬虫,数据处理,数据可视化以及机器学习建模.对我来说目标就是: 熟练使用numpy pandas 进行 ...

  8. python扫雷算法_python实战教程之自动扫雷(自己存下来学习之用)

    3.python的第三方库 win32api,win32gui,win32con,Pillow,numpy,opencv 可通过 pip install --upgrade SomePackage 来 ...

  9. python论坛签到_Python实现某论坛自动签到功能

    1.[文件] DakeleSign.py ~ 4KB #!/usr/bin/env python # -*- coding: utf-8 -*- __author__ = 'poppy' ''' da ...

最新文章

  1. 四种DCOM错误的区别,0x80080005 0x800706be 0x80010105 0x
  2. nginx特定的 404页面利于seo
  3. 初学图论-Bellman-Ford单源最短路径算法
  4. 中国队拿下口罩人脸识别世界第一!还将推出全球最大公开人脸数据集
  5. 和php工具箱一样的,将php工具箱或其它类似工具正确安装好,并写出安装步骤与注意事项...
  6. 【Linux系统编程】 浅谈标准I/O缓冲区
  7. 在GridView开头插入自动编号的方法
  8. 计算机辅助审计学心得,审计学心得体会2000字
  9. Java 实验5 T4 检验字符串是否合法
  10. go语言和php哪个建站好,从0开始Go语言,用Golang搭建网站
  11. linux下载tar包和rpm包以及镜像的地址分享一下
  12. 互联网的发展简史—web
  13. Hulu机器学习问题与解答系列 | 二十九:WGANs:抓住低维的幽灵
  14. Ping++ 牵手招商银行,正式为商户开放一网通支付渠道
  15. ValueError: The field admin.LogEntry.user was declared with a lazy reference to ‘MyApp.sysusers‘
  16. 【Java系列】(四)Java多线程---线程安全
  17. 如何在“运行”里打开软件
  18. MATLAB命令大全和矩阵操作大全
  19. Bios工程师手边事—SBIOS添加EC功能
  20. 基于QT的多媒体播放器

热门文章

  1. c# 操作IIS应用程序池
  2. 怎么修改RO服务器版本,谁知道build.prop的系统版本号怎么改
  3. JQuery DataTables改变行或列的背景或字体颜色
  4. JDBC中开启事务的批量插入操作
  5. 如何发布.Net MVC 网站项目(攻略集锦)
  6. 计算机网络考试试题库-期末考试题库含答案
  7. matlab平稳随机过程的功率谱密度,平稳随机过程的功率谱密度
  8. discuz php源码,Discuz7 php源码,该如何解决
  9. 图形驱动程序和显卡驱动什么区别_以后你的手机也需要单独安装显卡驱动程序了...
  10. 炒菜机器人放食材的顺序_珠江新城有了首家机器人餐厅,40多台机器人提供服务...