python之pexpect实现自动交互的例子


Posted in Python onJuly 25, 2019

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() 向子程序发送控制字符,比如 <kbd>ctrl+C</kbd> 或者 <kbd>ctrl+D</kbd> 之类的,比如你要向子程序发送 <kbd>ctrl+G</kbd>,那么就这样写:

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() #等待系统提示符,用于等待命令执行结束

详情请戳:https://3water.com/article/156232.htm

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

Python 相关文章推荐
在Python中使用pngquant压缩png图片的教程
Apr 09 Python
Python中isnumeric()方法的使用简介
May 19 Python
Python的CGIHTTPServer交互实现详解
Feb 08 Python
python实现txt文件格式转换为arff格式
May 31 Python
python绘制立方体的方法
Jul 02 Python
浅谈python在提示符下使用open打开文件失败的原因及解决方法
Nov 30 Python
pyqt5 comboBox获得下标、文本和事件选中函数的方法
Jun 14 Python
Python用Try语句捕获异常的实例方法
Jun 26 Python
tensorflow指定CPU与GPU运算的方法实现
Apr 21 Python
Python-jenkins 获取job构建信息方式
May 12 Python
django的403/404/500错误自定义页面的配置方式
May 21 Python
python requests库的使用
Jan 06 Python
Python使用lambda表达式对字典排序操作示例
Jul 25 #Python
浅析Python 引号、注释、字符串
Jul 25 #Python
django的auth认证,authenticate和装饰器功能详解
Jul 25 #Python
使用python telnetlib批量备份交换机配置的方法
Jul 25 #Python
python找出因数与质因数的方法
Jul 25 #Python
HTML的form表单和django的form表单
Jul 25 #Python
Python3 批量扫描端口的例子
Jul 25 #Python
You might like
PHP封装的字符串加密解密函数
2015/12/18 PHP
详解PHP实现定时任务的五种方法
2016/07/25 PHP
php mysql like 实现多关键词搜索的方法
2016/10/29 PHP
laravel实现分页样式替换示例代码(增加首、尾页)
2017/09/22 PHP
PHP面向对象五大原则之依赖倒置原则(DIP)详解
2018/04/08 PHP
基于laravel belongsTo使用详解
2019/10/18 PHP
Extjs学习笔记之九 数据模型(上)
2010/01/11 Javascript
javascript 闭包
2011/09/15 Javascript
jQuery-serialize()输出序列化form表单值的方法
2012/12/26 Javascript
省市区三级联动下拉框菜单javascript版
2015/08/11 Javascript
Vue异步组件使用详解
2017/04/08 Javascript
在iframe中使bootstrap的模态框在父页面弹出问题
2017/08/07 Javascript
微信小程序学习笔记之函数定义、页面渲染图文详解
2019/03/28 Javascript
Vue匿名插槽与作用域插槽的合并和覆盖行为
2019/04/22 Javascript
微信小程序tabBar 返回tabBar不刷新页面
2019/07/25 Javascript
浅谈laytpl 模板空值显示null的解决方法及简单的js表达式
2019/09/19 Javascript
深入浅析golang zap 日志库使用(含文件切割、分级别存储和全局使用等)
2020/02/19 Javascript
JS数组reduce()方法原理及使用技巧解析
2020/07/14 Javascript
在elementui中Notification组件添加点击事件实例
2020/11/11 Javascript
[51:32]Optic vs Serenity 2018国际邀请赛淘汰赛BO3 第一场 8.22
2018/08/23 DOTA
用python写的一个wordpress的采集程序
2016/02/27 Python
Python3.4编程实现简单抓取爬虫功能示例
2017/09/14 Python
在Django下测试与调试REST API的方法详解
2019/08/29 Python
使用Python将字符串转换为格式化的日期时间字符串
2019/09/01 Python
Pycharm小白级简单使用教程
2020/01/08 Python
python爬虫今日热榜数据到txt文件的源码
2021/02/23 Python
CSS3中的opacity属性使用教程
2015/08/19 HTML / CSS
localstorage和sessionstorage使用记录(推荐)
2017/05/23 HTML / CSS
Currentbody德国站:健康与美容技术专家
2020/04/05 全球购物
机械专业个人求职自荐信格式
2013/09/21 职场文书
英文版餐饮业求职信
2013/10/18 职场文书
同学聚会策划方案
2014/06/06 职场文书
制冷与空调专业毕业生推荐信
2014/07/07 职场文书
家庭财产分割协议书范本
2014/11/24 职场文书
大学生自荐信范文
2015/03/05 职场文书
HTML速写之Emmet语法规则的实现
2021/04/07 HTML / CSS