一、pexpect模块介绍

Pexpect使Python成为控制其他应用程序的更好工具。可以理解为Linux下的expect的Python封装,通过pexpect我们可以实现对ssh,ftp,passwd,telnet等命令行进行自动交互,
而无需人工干涉来达到自动化的目的

二、Pexpect的安装

#方法一:
pip3 install pexpect #方法二:源码安装

三、简单示例

import pexpect
#ssh登录,账号root,主机:114.114.114.114,端口5000
child = pexpect.spawn('/usr/binssh root@114.114.114.114 -p 5000')
#expect方法等待子程序产生的输出,判断是否匹配定义的字符串
child.expect('Password')
#匹配后则发送密码串进行回应
child.sendline('hello123') 注:spawn类无法在windows下运行
如果child.sendline('copy tftp://10.100.255.220/vip_user_list.txt flash:vip_user_list.txt')是一个下载文件命令,而下载过程又比较长,又不想将全局的timeout超时时间统一改太长?
解决方法如下:
child.timeout=1200  #超时时间12分钟
child.send(下载文件)
chile.expect('#')
child.timeout=30  #执行完下载命令,改回默认超时时间30秒即可

四、pexpect的核心组件

  4.1 spawn类

#功能:启动和控制子应用程序,以下是它的构造函数定义:
class pexpect.spawn(command, args=[], timeout=30, maxread=2000,
searchwindowsize=None, logfile=None, cwd=NOne, env=None, ignore_sighup=True) #各参数解析
#1. command参数可以使任意已知的系统命令,比如:
child = pexpect.spawn('/usr/bin/ftp') #启动ftp客户端命令
child = pexpect.spawn('/usr/bin/ssh root@114.114.114.114')#启动ssh远程连接命令
child = pexpect.spawn('ls -lattr /tmp') #运行ls显示/tmp目录内容命令 #2. args=[] 当子程序需要参数时,可以使用Python列表来代替参数项,如:
child = pexpect.spawn('/usr/bin/ftp',[])
child = pexpect.spawn('/usr/bin/ssh',[root@114.114.114.114'])
child = pexpect.spawn('ls ' ['-lattr' ,'/tmp']) #3. timeout 为等待结果的超时时间;
#4. maxread为pexpect从终端控制台一次读取的最大字节数
#5.searchwindowsize 为匹配缓冲区字符串的位置,默认是从开始位置匹配
#6.logfile 为写入到日志(打开文件或者终端sys.stdout),logfile也可单独出来,如
fout=open('mylog.txt','wb')
child.logfile = fout #打印到终端,child.logfile = sys.stdout打印到屏幕(在python3中,打印到屏幕需要在spawn(encodig='utf-8')指定编码类型),最后记得关掉fout.close()

ps:会存在会话结束,但是保存数据或打印到终端数据不完全问题,解决办法:延长执行命令的次数,跟时间无关,即多次使用无意义的expect(),send()来让数据有足够的时间传回来保存 注:pexpect无法解析shell命令中的元字符(>,|,*),解决办法:
#方法一:
child = pexpect.spawn('/bin/bash -c "ls -l | grep LOG > logs.txt"')
child.expect(pexpect.EOF) #方法二:
shell_cmd = 'ls -l | grep LOG > logs.txt'
child=pexpect.spawn('/bin/bash',['-c',shell_cmd])
child.pexpect(pexpect.EOF) ==================================================================================
#expect方法
#expect定义了一个子程序的匹配规则
#方法定义:
expect(pattern,timeout=-1,searchwindowsize=-1) #参数介绍
#1.pattern为字符串或正则表达式或pexpect.EOF(指向缓冲区尾部,无匹配项)或pexpect.TIMEOUT(匹配等待超时)或者前四种组成的列表,返回列表的索引值
#2.timeout为等待匹配结果的超时时间,超时会触发pexpect.TIMEOUT
#3.searchwindowsize为匹配缓冲区字符串的位置,默认是从开始位置匹配 #pattern为列表的使用:
#方法一:
p = pexpect.spawn('xxx')
index = p.expect(['good','bad',pexpect.EOF,pexpect.TIMEOUT])
if index == 0:
fun1()
elif index ==1:
fun2()
elif index ==2:
fun3()
elif index==3:
fun4() #方法二:
p = pexpect.spawn('xxx')
index = p.expect(['good','bad'])
try:
if index ==0:
fun1()
elif index ==1:
fun2()
expect EOF:
fun3()
expect TIMEOUT:
fun4() #expect方法里的before和after
#before:保存了最近匹配成功的内容,俩次child.expect()之间的内容,不包含pattern部分
#after:保存了最近匹配成功之后的内容,即child.expect(这里面的内容) #before与after例子
import pexpect
import sys
dhild = pexpect.spawn('ssh root@192.168.2.1')
child.expect(['password:'])
child.sendline('hello123')
print ('before:',child.before)
print ('after:',child.after)

==========================================================================================
#read相关方法,与expect捕捉相配套使用
send(self,s) #发送命令,不回车
sendline(self,s='') #发送命令,回车
sendcontrol(self,char) #发送控制字符,如child.sendcontrol('c')等价于‘ctrl + c’
sendeof() #发送eof

  4.2 run函数

#run格式
pexpect.run(command,timeout=-1,withexitstatus=False,events=None,\
extra_args=None,logfile=None,cwd=None,env=None)
#参数解析:
command:系统已知命令
event:字典,定义了expect与sendline对应关系 #实例
from pexpect import *
child=spawn('scp foo user@example.com:.')
child.expect('(?i)password')
child.sendline(mypassword) #等同于
from pexpect import *
run('scp foo user@example.com:.',events={'(?i)password':mypassword})

  4.3 pxssh类

#pxssh格式:
class pexpect.pxssh.pxssh(timeout=30,maxread=2000,searchwindowsize=None,logfile=None,cwd=None,env=None)
#常见的三种方法
login() #建立ssh连接
logout() #断开连接
prompt() #等待系统提示符,用于度鞥带命令执行结束 #pxssh例子:ssh登录设备执行命令,取回结果
from pexpect import pxssh
import getpass
try:
s=pxssh.pxssh() #创建pxssh对象
hostname=input('hostname:').strip()
username=input('username:').strip()
password=getpass.getpass('password:').strip() #接收密码输入
s.login(hostname,username,password) #建立ssh连接
s.sendline('uptime') #运行uptime命令
s.prompt() #匹配系统提示符
print (s.before.decode'utf-8') #打印出现系统提示符前的命令输出
s.sendline('ls -l')
s.prompt()
print (s.before.decode'utf-8')
s.sendline('df')
s.prompt()
print(s.before.decode'utf-8')
s.logout() #断开ssh连接
except pxssh.ExceptionPxssh as e:
print ('pxssh failed on login.')
print (str(e))

Python模块之pexpect的更多相关文章

  1. Python中的Pexpect模块的简单使用

    Pexpect 是一个用来启动子程序并对其进行自动控制的 Python 模块. Pexpect 可以用来和像 ssh.ftp.passwd.telnet 等命令行程序进行自动交互.以下所有代码都是在K ...

  2. 50个很棒的Python模块

    50个很棒的Python模块 我很喜欢Python,Python具有强大的扩展能力,我列出了50个很棒的Python模块,包含几乎所有的需要:比如Databases,GUIs,Images, Soun ...

  3. python模块大全

    python模块大全2018年01月25日 13:38:55 mcj1314bb 阅读数:3049 pymatgen multidict yarl regex gvar tifffile jupyte ...

  4. python开发_常用的python模块及安装方法

    adodb:我们领导推荐的数据库连接组件bsddb3:BerkeleyDB的连接组件Cheetah-1.0:我比较喜欢这个版本的cheetahcherrypy:一个WEB frameworkctype ...

  5. [转]50个很棒的Python模块

    转自:http://www.cnblogs.com/foxhengxing/archive/2011/07/29/2120897.html Python具有强大的扩展能力,以下列出了50个很棒的Pyt ...

  6. 常用的python模块及安装方法

    adodb:我们领导推荐的数据库连接组件 bsddb3:BerkeleyDB的连接组件Cheetah-1.0:我比较喜欢这个版本的cheetahcherrypy:一个WEB frameworkctyp ...

  7. python 终端模拟模块 pexpect

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

  8. 使用C/C++写Python模块

    最近看开源项目时学习了一下用C/C++写python模块,顺便把学习进行一下总结,废话少说直接开始: 环境:windows.python2.78.VS2010或MingW 1 创建VC工程 (1) 打 ...

  9. Python模块之configpraser

    Python模块之configpraser   一. configpraser简介 用于处理特定格式的文件,其本质还是利用open来操作文件. 配置文件的格式: 使用"[]"内包含 ...

随机推荐

  1. Golang 高效实践之并发实践

    前言 在我前面一篇文章Golang受欢迎的原因中已经提到,Golang是在语言层面(runtime)就支持了并发模型.那么作为编程人员,我们在实践Golang的并发编程时,又有什么需要注意的点呢?下面 ...

  2. dockerfile 制作镜像

    # Set the base image to UbuntuFROM ubuntu # File Author chenghanMAINTAINER chenghan ################ ...

  3. Ubuntu 18.04 root 使用ssh密钥远程登陆

    前言: Ubuntu默认是禁止root用户远程登陆 本教程解决Ubuntu 18.04版本 root用户 使用ssh密钥无法远程登陆的问题 问题发生的环境: 腾讯云,重装Ubuntu服务器时选择使用s ...

  4. C#跟Lua如何超高性能传递数据

    前言 在UWA学堂上线那天,我买了招文勇这篇Lua交互的课程,19块还算值,但是前段时间太忙,一直没空研究,他的demo是基于xlua的,今天终于花了大半天时间在tolua下跑起来了,记录一下我的理解 ...

  5. JAVA通过URL链接获取视频文件信息(无需下载文件)

    最近项目碰到一个大坑:APP上需要在获取视频列表时就获取视频的时长,但早期上传的时候数据库都没有保存这个数据,所以前段时间添加一个时长字段,在上传时手动输入视频时长,但是之前库中有上万条数据没这个信息 ...

  6. C#3.0新增功能09 LINQ 基础04 基本 LINQ 查询操作

    连载目录    [已更新最新开发文章,点击查看详细] 本篇介绍 LINQ 查询表达式和一些在查询中执行的典型操作. 获取数据源 在 LINQ 查询中,第一步是指定数据源. 和大多数编程语言相同,在使用 ...

  7. [leetcode] 234. Palindrome Linked List (easy)

    原题 回文 水题 function ListNode(val) { this.val = val; this.next = null; } /** * @param {ListNode} head * ...

  8. 从0系统学Android-2.4隐式Intent

    本系列文章,参考<第一行代码>,作为个人笔记 更多内容:更多精品文章分类 使用隐式 Intent 相对于显示 Intent ,隐式 Intent 比较含蓄.这种方式不明确指出我们想要启动哪 ...

  9. Python 学习笔记 编程基础汇总000

    编程基础知识汇总000 1.计算机结构 2.编程语言分类 3.字符编码由来 计算机结构 计算机组成五大部件: 控制器.运算器.存储器.输入.输出 控制器(Controler):对程序规定的控制信息进行 ...

  10. PHP7安装mysql扩展

    1.下载mysql扩展 http://git.php.net/?p=pecl/database/mysql.git;a=summary 2.解压后并使用phpize工具初始化(phpize一般在php ...