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

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实现自动交互的例子就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持脚本之家。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/558283.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

视频显示边缘空白的真相

在多媒体开发过程中,难免会使用到video这一类型。但一直有部分开发者或产品人员总提出 “视频画面没有充满”其给定的窗口,其原因在于对视频不了解,想当然的去认为要“充满”。被问到此问题只能苦笑一声,哭笑不得。 先看下几个效果…

word公式编辑器_毕业论文里面的各种公式该如何编辑

毕业论文中很多专业都会需要书写很多公式,而对于对Word使用不够熟练的朋友肯定会在编辑公式上很苦恼了,Word自带的公式编辑器又不够方便,本节给大家介绍一种很方便的公式编辑方法,而且更改公式后公式序号会自动跟着变。安装好后打…

Gensee移动SDK之(一)结构组成

gensee 移动sdk现已更新到v3.3,自1.0到3.0的过度当中,经历了几次大的变革。每次变革都新的功能接口和结构上微妙的变化,但直播、点播的结构组成基本定型,即便是扩展也会依此延续。Sdk为了界面上的自由度,不提供完整的U…

python分析服务器日志_python实现web服务器日志分析脚本

python日志分析脚本用python可以实现大日志文件的分析,比如查到sql注入语句,然后看到IP,就可以改下脚本,用IP为特征取出日志,分析入侵过程。python比较shell脚本的优点是速度快,性能好,跑1G日志…

Gensee移动SDK之(二)协议

首先,对于协议而言,有标准的,也有私有的,就看具体使用场景的修饰与更改情况了。部分朋友在接触SDK的时候会提出此疑问,只能说“各怀鬼胎”。第一,即便我们告知我们使用的协议,该用sdk的时候&…

vs点击方法跳不到对于的地方_内脏脂肪怎么测?这个方法也太方便了!| EASD 2020...

我马上开始减肥还不行么?秋天——丰收的日子,看着肥美的鱼蟹,软糯的栗蓉,甜美的桂花糕,不认真贴秋膘都对不起这么丰盛的美食!等等,别想了,看看肚子上层层叠起的肥肉,量量…

Gensee Android SDK(一)组成结构

在分支平台Android上sdk,基本主线不会变,变的只是与平台相关的部分,例如视频采集、音频采集、权限等。 按功能分类分为 RtSDK 重点是可以支持视频互动、发(控制)直播的能力。接口功能上基本上等同于PC客户端。 可以做…

python中msg是什么意思_python下载.msg文件的附件

def get_attachments(file_name, path_name):"""获取.msg文件内的附件:param file_name: .msg文件路径:param path_name: 附件存放目录:return: None"""outlook win32com.client.Dispatch("Outlook.Application").GetNamespace("…

云服务器Ubuntu系统安装apache2发生“E: Unable to locate package”

Ubuntu安装apache2发生“E: Unable to locate package”云服务器安装apache2 出错E: Unable to locate package安装apache2测试apache2安装云服务器安装apache2 出错E: Unable to locate package 最近买了个云主机,操作系统由centos换成Ubuntu的之后,先…

python 构造函数继承_Python多重继承的异构构造器

在Python里面,如果你使用上Qt,SQLAlchemy,Twisted之类各种大型类库时候,有时候多重继承Multiple Inheritance是个简单的解决方法,但是多重继承的复杂性总容易造成误解和疑惑。一般“常识”说,使用super访问…

Android OpenGL Cannot create GL program: 0 GL error: 1282

Android OpenGL create GL program: 0 & GL error: 1282 快速解决 1. 使用GLSurfaceView的话 请在继承类中合适的地方(一般是构造函数里面)设置当前的clientversion 为 2 具体代码: setEGLContextClientVersion(2);2. 使用自己构建的opengl环境的话 请在创…

pythoncsv格式列变换_用Python将csv行转换为列

关于如何使用zip合并数据以及转置列表的一些提示。这听起来像是如何转置csv是你真正的问题。如何转置csv的答案是将其放入列表列表(例如通过csv模块),然后将其转置并写回文件(如果需要)。在row1 [1,2,3]row2 [a, b, c]list(zip(row1, row2))Out[45]: [(1, a), (2,…

Android DDMS的打开以及查看手机页面布局层次

ddms 查看android的界面布局层次 有时候看到一个比较好的界面或体验好的界面,就忍不住想看看其实现结果,那么可以通过DDMS工具来看相连设备层次以及使用哪些view。 上图是查看微信布局展现。说明,这里查看的就是显示在当前屏幕上的界面&am…

python转换窗口无响应_Tkinter窗口显示(没有响应),但代码正在运行

我有一个程序,在你点击一个操作按钮后运行一个很长的过程。当进程运行时,根窗口会说它没有响应,即使我知道程序是在后台运行的。这个程序将发布给我的几个同事,我想确保他们看到这个时不会惊慌失措,关上窗户。我的解决…

mac os11以下安装Xcode

前段时间mac重装系统,所有软件都清除了,下载从商店里面安装Xcode 12.5.1版本,直接提示“要求mac os 11.0或更高版本,于是乎开始升级mac os,检查更新并更新之后,最新版本就是macOS Catalina10.15.7&#xff…

fft之后求模值和相位_如何利用相位噪声测量表征时钟抖动来加速设计验证过程...

随着数据速率的提高,时钟抖动分析的需求也在与日俱增。在高速串行数据链路中,时钟抖动会影响发射机、传输线和接收机的数据抖动。时钟质量保证的测量方法也在不断发展。目前的重点是针对比特误码率(BER) 建立时钟性能和系统性能之间的直接联系。今天我们…

Android Studio 内存不足

android studio 4.2.2 编译的项目的时候,出现的内存不足问题,实际上android studio会有引导设置内存大小,可能都不太在意在哪个地方,设置完就完事了,在不提示的情况下可能找不到在哪设置,在此记录一笔。 出…

python寻找多数元素_寻找多数元素

定义:序列中的多数元素是指在一个元素个数为n的序列中,多数元素出现次数大于[n/2].寻找元素方法很多:1.可以暴力搜索,将每个元素都与其他元素作比较,然后统计该元素出现的次数,时间复杂度为O(n2)&#xff1…

mac 电脑安装 svn和brew

快速解决: 1. 安装svn brew install subversion 2. 安装brew 记得多尝试分别选择不同的下载源,鄙人最终是选择 “3 北京外国语大学” 成功的。 /bin/zsh -c "$(curl -fsSL https://gitee.com/cunkai/HomebrewCN/raw/master/Homebrew.sh)"折…

监控mysql锁定状态_企业实战Mysql不停机维护主从同步

实战环境:Mysql-5.7Xtrabackup-2.4Xtrabackup 介绍:Percona XtraBackup是一款基于MySQL的服务器的开源热备份实用程序,在备份过程中不会锁定数据库。它可以备份来自MySQL5.1,5.5,5.6和5.7服务器上的InnoDB,…