python sendline_python Pexpect模块的使用

Pexpect简介

在讲解Pexpect之前,我们需要先了解一下Expect这个脚本语言,它是由TCL语言实现的,主要用于人机交互式对话的自动化控制,可以用来完成ssh、ftp、telnet等命令行程序的自动化交互。Pexpect其实就是一个用Python语言实现的类Expect功能的模块,通过它就可以在Python中完成Expect所完成的功能。

Pexpect的基本工作流程,基本可以分为以下三个步骤:

首先用spawn来执行一个程序;

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

最后当发现这个关键字以后,使用send/sendline方法发送字符串给这个程序。

通常在程序中第一步只需要做一次,第二步和第三步会不停的循环来完成整个工作。当然在Pexpect中还有很多其他方法,编写程序时可以根据自己的需求选择使用。

Pexpect API

spawn类

class spawn(SpawnBase):

'''This is the main class interface for Pexpect. Use this class to start

and control child applications. '''

# This is purely informational now - changing it has no effect

use_native_pty_fork = use_native_pty_fork

def __init__(self, command, args=[], timeout=30, maxread=2000,

searchwindowsize=None, logfile=None, cwd=None, env=None,

ignore_sighup=False, echo=True, preexec_fn=None,

encoding=None, codec_errors='strict', dimensions=None,

use_poll=False):

通过spawn()方法用来执行一个程序,返回程序的操作句柄,后续就可以通过操作句柄来与这个程序进行交互了。

# 子程序退出时会引发pexpect.EOF异常,即如果捕捉到pexpect.EOF则说明子程序已退出

process = pexpect.spawn('ls -l')

process.expect(pexpect.EOF)

result = process.before.decode()

print(result)

command参数并不支持字符的特殊含义(比如管道符、通配符、重定向符等),在Linux系统中如果想使用这些符号的特殊含义就必须加上shell来运行。

# 示例一

process = pexpect.spawn('bash -c "ls -l | wc -l"')

process.expect(pexpect.EOF)

# 示例二

# 第一个参数为主程序,而args列表里的元素是主程序的参数

process = pexpect.spawn('bash', ['-c', 'ls -l | wc -l'])

process.expect(pexpect.EOF)

expect()方法

当使用spawn()方法启动了一个程序并返回程序控制句柄后,就可以使用expect()方法来等待指定的关键字了。关键字可以是字符串、正则表达式、EOF、TIMEOUT或者以上类型组成的列表,用来匹配子程序返回的结果。如果只提供字符串等非列表,则匹配成功后返回0,如果提供列表,则返回匹配成功的列表元素的索引,匹配失败会抛出异常。

process = pexpect.spawn('ls -l')

# 匹配expect字符

process.expect('expect')

before/after/match:当expect()匹配到关键字之后,系统会自动给这三个变量赋值,通过这三个变量可以获取子程序运行输出。

before:保存了到匹配到关键字为止,缓存里面已有的所有数据。也就是说如果缓存里缓存了100个字符的时候匹配到了关键字,那before就是除了匹配到的关键字之外的所有字符。

after:保存了匹配到了关键字。

match:保存的是匹配到的正则表达式的实例,和上面的after相比一个是匹配到的字符串,一个是匹配到的正则表达式实例。

process = pexpect.spawn('ls -l')

process.expect('expect')

print(process.before.decode())

print(process.after.decode())

print(process.match)

如果expect()过程中发生错误,那么before保存到目前为止缓存里的所有数据,after和match都是None。

如果没匹配成功则会抛出异常,可以通过匹配异常,让异常不在终端显示。

process = pexpect.spawn('ls -l')

# 返回0表示匹配成功,返回1和2表示匹配到了异常

index = process.expect(['expect', pexpect.EOF, pexpect.TIMEOUT])

print(index)

send()/sendline()方法

sendline()和send()的区别就是sendline()发送的是带回车符的字符串。

process = pexpect.spawn('nslookup')

process.expect('>')

process.sendline('www.baidu.com')

process.expect('>')

print(process.before.decode())

process.sendline('exit')

Pexpect还提供了很多其他方法,这里不再详细阐述,使用时可参考其官方文档。

interact()方法

interact()表示将终端控制权交给用户(或者说将标准输入交给用户)。通常情况下Pexpect会接管所有的输入和输出,如果需要用户介入完成部分工作的时候,interact()就派上用场了。

# 让出控制权给用户

process.interact()

# 通过设置escape_character的值定义返回码,当用户输入此值后,会将控制权重新交给pexpect

process.interact(escape_character='\x1d', input_filter=None, output_filter=None)

应用示例

接下来通过SSH连接远程服务器的示例来体验下Pexpect的使用方法。

#!/usr/bin/env python3.6

#-*- coding:utf-8 -*-

import pexpect

def main(server):

command = 'ssh -p %s %s@%s' % (server['port'], server['username'], server['hostname'])

process = pexpect.spawn(command, timeout=30)

print(f'命令: {command}')

expect_list = [

'yes/no',

'password:',

pexpect.EOF,

pexpect.TIMEOUT,

]

index = process.expect(expect_list)

print(f'匹配到: {index} => {expect_list[index]}')

if index == 0:

process.sendline("yes")

expect_list = [

'password:',

pexpect.EOF,

pexpect.TIMEOUT,

]

index = process.expect(expect_list)

print(f'匹配到: {index} => {expect_list[index]}')

if index == 0:

process.sendline(server['password'])

process.interact()

else:

print('EOF or TIMEOUT')

elif index == 1:

process.sendline(server['password'])

process.interact()

else:

print('EOF or TIMEOUT')

if __name__ == '__main__':

server = {

'hostname': '192.168.1.100',

'port': '22',

'username': 'admin',

'password': 'ABuklhsfnVyxI',

}

main(server)

以上就是python Pexpect模块的使用的详细内容,更多关于python Pexpect模块的资料请关注脚本之家其它相关文章!

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

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

相关文章

RocketMQ消息丢失场景及解决办法,已拿offer入职

前言 当前我们都会说SpringBoot是Spring框架对“约定优先于配置理念的最佳实践的产物,一个典型的SpringBoot应用本质上其实就是一个基于Spring框架的应用,而如果大家对Spring框架已经了如指掌,那么,在我们一步步揭开SpringBoot微…

java抓rtp包_Wireshark抓取RTP包,还原语音

最近在做基于SIP的VoIP通信研究,使用Wireshark软件可以对网络流量进行抓包。VoIP使用RTP协议对语音数据进行传输,语音载荷都封装在RTP包里面。要对传输中的语音进行截获和还原,需要通过Wireshark对RTP包进行分析和解码。该过程如下&#xff1…

RocketMQ消费者是如何获取消息的?转疯了!

前言 前两天,我收到了蚂蚁金服的offer,从朋友的内推开始面试到拿到最后offer经历了4面技术、一面交叉面和一面HR面。经过了漫长的等待和几次几乎折磨的面试之后,终于拿到了offer。 第1章:Dubbo的简史、后续的规划和整体架构大图 …

java if在内存中_java如何将对象暂存到内存中?

展开全部form表单提交文件,建议用62616964757a686964616fe59b9ee7ad9431333264623862smartupload上传,暂存在web服务器目录下,然后稍微一下下面的代码,ftp上传后,删除暂存文件,okimport java.io.File;impor…

K8S+Docker理论与实践深度集成

前言: 这篇文章主要介绍了26道Spring经典面试题总结(附带答案)的相关资料,小编在网上看到的觉得挺不错的,现在分享给大家,希望对你们有所帮助。 另外本人整理收藏了多家公司面试知识点整理 ,以及各种Java核心知识点免费分享给大…

java 注解 方法 参数_java在注解中绑定方法参数的解决方案

我们有这样子的需求,需要记录用户操作某个方法的信息并记录到日志里面,例如,用户在保存和更新任务的时候,我们需要记录下用户的ip,具体是保存还是更新,调用的是哪个方法,保存和更新的任务名称以…

Kafka的精髓全写这本“限量笔记”里了

前言 大厂面试真题向来是求职者的最佳练兵场,华为在Java开发工程师招聘中有哪些技术性考察和倾向?那今天咱就给大家分享一下近期的华为5面面经! 注:以下所分享的华为面试问题,相关的答案我也整理出来了,且…

gcc是java的什么意思_为什么gcc支持Java而不是C#

我已经seen this question了,我想知道是否有任何技术理由可以证明gcc支持Java但不支持C#.如果我理解,Java也是一种解释性语言.如果Mono提供C#编译器和CIL的实现,为什么不能创建一个将C#转换为IL然后静态编译的gcc c#编译器?解决方法:如果编译器工具链不支持特定语言…

MongoDB数据分布不均的解决方案

前言 算法血拼:Google百度Alibaba字节Tencent网易360拼夕夕美团 不知不觉双11就来了,轰轰烈烈的秋招也完美结束了,不知算法与数据结构成为了多少小伙伴进击大厂的绊脚石? 恰好,我这两天花了点时间,整理了些各大厂(G…

Mybatis-plus常用API全套教程

前言 前两天,我收到了蚂蚁金服的offer,从朋友的内推开始面试到拿到最后offer经历了4面技术、一面交叉面和一面HR面。经过了漫长的等待和几次几乎折磨的面试之后,终于拿到了offer。 正文 下文中截图来源于朋友一个pdf版本的面经,…

我的世界手动选择java_如何选中路径-我的世界怎么选择java路?我的世界怎么选择java路径 爱问知识人...

2014-06-03 11:26:47首先确定你安装了Java,如没有自行去官网下载最近版本 如果已安装,打开启动器,一般的启动器都有设置选项,在设置里选择正确的Java路径或者让启动器自行搜索 设置完毕后启动游戏~全部2014-06-03 11:26:472014-06…

Mycat和Mysql搭建高可用企业数据库集群

个人背景 如标题所示,我的个人背景非常简单,Java开发经验1年半,学历普通,2本本科毕业,毕业后出来就一直在Crud,在公司每天重复的工作对我的技术提升并没有什么帮助,但小镇出来的我也深知自我努…

java过滤器如何操作数据库_jsp – 使用Java中的过滤器验证用户名,密码(与数据库联系)...

String sql”select * from reg where username”user”‘ and pass”pwd”‘”;这是一个非常糟糕的做法.这种方法要求用户名和密码都通过请求传递普通香草.而且,你有一个SQL注入攻击漏洞.利用会话,在JSP / Servlet中你有HttpSession.实际上也没有必要在使用过滤器的每个请求上…

MySQL+Tomcat+JVM,看完还怕面试官

前言 我朋友也是个写了四年Java代码的程序员,跟女友已经恋爱多年,最近突然结婚了。 他结婚以前,换了一家公司,咱俩就好久没见过面了。刚好今天出门办事碰上了,找了一家店坐一起喝酒聊天。 我聊天时打趣他&#xff1…

java因子分析_因子分析(Factor Analysis)

1 问题之前我们考虑的训练数据中样例的个数m都远远大于其特征个数n&#xff0c;这样不管是进行回归、聚类等都没有太大的问题。然而当训练样例个数m太小&#xff0c;甚至m<多元高斯分布的参数估计公式如下&#xff1a;分别是求mean和协方差的公式&#xff0c;表示样例&#…

MySQL+多线程+Redis+算法+网络

开头 我们面试的时候 &#xff0c;经常会被问这种到问题:Spring中bean的循环依赖怎么解决&#xff1f; Spring中bean的加载过程&#xff1f; spring相关的问题一直是大厂面试常问到的一个问题,也是一直困扰这我们&#xff0c;不知道从哪里下手&#xff0c;今天举例分析大厂的一…

python 函数进度条怎么_python输出结果刷新及进度条的实现操作

print函数python输出主要使用print函数&#xff0c;print函数介绍&#xff1a;print(*objects, sep" ", end"", filesys.stdout, flushFalse)*objects表示要打印的值&#xff0c;表示多个无名参数或需要打印的值&#xff1b;sep" "&#xff0c;对…

MySQL优化原理分析及优化方案总结

前言 今天中午收到我司安全部发了一封邮件&#xff1a;Jackson存在安全漏洞。查了一下&#xff0c;这件事并不算很新鲜了&#xff08;已经过了5天的样子&#xff09;&#xff0c;本文来聊聊吧。 说起来还蛮戏剧化&#xff1a;阿里云向Jackson官方提交了一个Jackson序列化安全…

MySQL千万数据量深分页优化

前言 提到MySQL的事务&#xff0c;我相信对MySQL有了解的同学都能聊上几句&#xff0c;无论是面试求职&#xff0c;还是日常开发&#xff0c;MySQL的事务都跟我们息息相关。 而事务的ACID&#xff08;即原子性Atomicity、一致性Consistency、隔离性Isolation、持久性Durabili…

Mysql和Redis数据同步该怎么做

前言 算法血拼&#xff1a;Google百度Alibaba字节Tencent网易360拼夕夕美团 不知不觉双11就来了,轰轰烈烈的秋招也完美结束了,不知算法与数据结构成为了多少小伙伴进击大厂的绊脚石&#xff1f; 恰好&#xff0c;我这两天花了点时间&#xff0c;整理了些各大厂&#xff08;G…