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中的列表推导浅析
Apr 26 Python
详解Python的迭代器、生成器以及相关的itertools包
Apr 02 Python
合并百度影音的离线数据( with python 2.3)
Aug 04 Python
[原创]使用豆瓣提供的国内pypi源
Jul 02 Python
Python SMTP发送邮件遇到的一些问题及解决办法
Oct 24 Python
Python3.6+Django2.0以上 xadmin站点的配置和使用教程图解
Jun 04 Python
Django框架创建mysql连接与使用示例
Jul 29 Python
python进程池实现的多进程文件夹copy器完整示例
Nov 27 Python
python如何写出表白程序
Jun 01 Python
python怎么调用自己的函数
Jul 01 Python
python从ftp获取文件并下载到本地
Dec 05 Python
关于Python OS模块常用文件/目录函数详解
Jul 01 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中用于检测一个地理IP地址是否可用的代码
2012/02/19 PHP
ThinkPHP在新浪SAE平台的部署实例
2014/10/31 PHP
thinkPHP+PHPExcel实现读取文件日期的方法(含时分秒)
2016/07/07 PHP
PHP利用超级全局变量$_GET来接收表单数据的实例
2016/11/05 PHP
Yii2框架可逆加密简单实现方法
2017/08/25 PHP
php-msf源码详解
2017/12/25 PHP
JavaScript 一道字符串分解的题目
2011/08/03 Javascript
浅析javascript异步执行函数导致的变量变化问题解决思路
2016/05/13 Javascript
JavaScript prototype属性详解
2016/10/25 Javascript
微信小程序中使元素占满整个屏幕高度实现方法
2016/12/14 Javascript
bootstrap table表格使用方法详解
2017/04/26 Javascript
jquery animate动画持续运动的实例
2017/11/29 jQuery
vue脚手架中配置Sass的方法
2018/01/04 Javascript
d3.js实现自定义多y轴折线图的示例代码
2018/05/30 Javascript
jQuery 操作 HTML 元素和属性的方法
2018/11/12 jQuery
JS实现获取自定义属性data值的方法示例
2018/12/19 Javascript
JavaScript常见鼠标事件与用法分析
2019/01/03 Javascript
Python交换变量
2008/09/06 Python
Python Web编程之WSGI协议简介
2018/07/18 Python
python实现蒙特卡罗方法教程
2019/01/28 Python
Python时间和字符串转换操作实例分析
2019/03/16 Python
python 二维矩阵转三维矩阵示例
2019/11/30 Python
Python selenium如何打包静态网页并下载
2020/08/12 Python
Python中正则表达式对单个字符,多个字符和匹配边界等使用
2021/01/27 Python
10个顶级Python实用库推荐
2021/03/04 Python
open_basedir restriction in effect. 原因与解决方法
2021/03/14 PHP
HMV日本官网:全球知名的音乐、DVD和电脑游戏零售巨头
2016/08/13 全球购物
美国创意之家:BulbHead
2017/07/12 全球购物
网络安全方面的面试题
2015/11/04 面试题
如何用JQuery进行表单验证
2013/05/29 面试题
小学三年级数学教学反思
2014/01/31 职场文书
初中生评语大全
2014/04/24 职场文书
学生鉴定评语大全
2014/05/05 职场文书
2014年幼儿园老师工作总结
2014/12/05 职场文书
公司仓管员岗位职责
2015/04/01 职场文书
教师继续教育反思周记
2015/06/25 职场文书