python expect_python--pexpect

大家好,最近工作比较忙,所以没时间来更新博客。趁着还没在下个版本来临之前,来这边再更新更新。是之前学习到的一些老知识点,就当来巩固一下了。开心QAQ

今天给大家介绍的是--Pexpect

Expect 程序主要用于人机对话的模拟

1.运行程序

2.程序要求人的判断和输入

3.Expect 通过关键字匹配

4.根据关键字向程序发送符合的字符串

基本使用流程

基本使用流程

1.首先用 spawn 来执行一个程序

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

3.最后当发现这个关键字以后,根据关键字用 send 方法来发送字符串给这个程序

以下就是代码了,比较简单。但很实用

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

"""This runs a command on a remote host using SSH. At the prompts enter hostname,

user, password and the command."""

importpexpectimportgetpass, os#user: ssh 主机的用户名#host:ssh 主机的域名#password:ssh 主机的密码#command:即将在远端 ssh 主机上运行的命令

defssh_command (user, host, password, command):"""This runs a command on the remote host. This could also be done with the

pxssh class, but this demonstrates what that class does at a simpler level.

This returns a pexpect.spawn object. This handles the case when you try to

connect to a new host and ssh asks you if you want to accept the public key

fingerprint and continue connecting."""ssh_newkey= 'Are you sure you want to continue connecting'

#为 ssh 命令生成一个 spawn 类的子程序对象.

child = pexpect.spawn('ssh -l %s %s %s'%(user, host, command))

i= child.expect([pexpect.TIMEOUT, ssh_newkey, 'password:'])#如果登录超时,打印出错信息,并退出.

if i == 0: #Timeout

print 'ERROR!'

print 'SSH could not login. Here is what SSH said:'

printchild.before, child.afterreturnNone#如果 ssh 没有 public key,接受它.

if i == 1: #SSH does not have the public key. Just accept it.

child.sendline ('yes')

child.expect ('password:')

i= child.expect([pexpect.TIMEOUT, 'password:'])if i == 0: #Timeout

print 'ERROR!'

print 'SSH could not login. Here is what SSH said:'

printchild.before, child.afterreturnNone#输入密码.

child.sendline(password)returnchilddefmain ():#获得用户指定 ssh 主机域名.

host = '10.240.176.172'

#获得用户指定 ssh 主机用户名.

user = 'root'

#获得用户指定 ssh 主机密码.

password = 'tester'

#获得用户指定 ssh 主机上即将运行的命令.

command = 'ls -a /home'child=ssh_command (user, host, password, command)#匹配 pexpect.EOF

child.expect(pexpect.EOF)#输出命令结果.

printchild.beforeif __name__ == '__main__':try:

main()exceptException, e:printstr(e)#traceback.print_exc()

os._exit(1)

需要注意的知识点:

spawn() 方法用来执行一个程序,打开一个到 (user, host, command) 服务器的 ssh 连接

spawn() ,或者说 pexpect 并不会转译任何特殊字符

process = pexpect.spawn('/bin/bash –c "ls –l | grep LOG > log_list.txt"') or

cmd = "ls –l | grep LOG > log_list.txt"

process = pexpect.spawn("/bin/bash", ["-c", cmd])

process.expect(pexpect.EOF)

timeout - 超时时间

默认值: 30 (单位:秒)

maxread - 缓存设置

默认值: 2000 (单位:字符)

指定一次性试着从命令输出中读多少数据。如果设置的数字比较大,那么从 TTY 中读取数据的次数就会少一些。

设置为 1 表示关闭读缓存

logfile - 运行输出控制

默认值: None

process = pexpect.spawn("ftp sw-tftp", logfile=sys.stdout) 如果你想看到spawn过程中的输出,那么可以将这些输出写入到 sys.stdout

process = pexpect.spawn("ftp sw-tftp")

logFileId = open("logfile.txt", 'w')

process.logfile = logFileId

logfile_read - 获取标准输出的内容

默认值: None

记录执行程序中返回的所有内容,也就是去掉你发出去的命令,而仅仅只包括命令结果的部分:

process.logfile_read = sys.stdout

cwd - 指定命令执行的目录

默认值: None 或者说 ./

sendline("ls –l", cwd="/etc") 在 /etc 目录下执行 ls –l 命令

expect() - 关键字匹配

后面的匹配关键字是一个列表的话,就会返回一个数字表示匹配到了列表中第几个关键字,从 0 开始计算。

index = process.expect([

'Permission Denied',

'Terminal type',

'ftp>',

])

if index == 0:

print "Permission denied at host, can't login."

process.kill(0)

elif index == 1:

print "Login ok, set up terminal type…"

process.sendline('vty100')

process.expect("ftp>")

elif index == 2:

print "Login Ok, please send your command"

process.interact()

0.权限不足,这可能是ftp服务器出现问题,或者没有这个帐号,或者其他什么情况,反正只要发现这种情况的话,我们就给用户提示一下,

然后杀掉这个进程

1.登陆成功,但还要用户指定终端模式才能真正使用,所以我们在代码中指定了 vty100 这种模式,然后看是不是能真正使用了

2.还是登陆成功了,而且还可以直接输入命令操作 ftp 服务器了,于是我们提示用户,然后把操作权限交给用户

另外有一种特殊情况,如果同时有2个被匹配到,那么怎么办?简单来说就是这样:

原始流中,第一个被关键字匹配到的内容会被使用

匹配关键字列表中,最左边的会被使用

child.expect(['(?i)etc', '(?i)readme', pexpect.EOF, pexpect.TIMEOUT])

前 2 个匹配都是大小写无关的,关键就是这个 (?i) 匹配规则,它相当于 re.IGNORE 或者 re.I 这个关键字

send() - 发送关键字

send() 作为3个关键操作之一,用来向程序发送指定的字符串,它的使用没什么特殊的地方,比如:

process.expect("ftp>")

process.send("by\n")

sendline() - 发送带回车符的字符串

sendline() 和 send() 唯一的区别就是在发送的字符串后面加上了回车换行符,这也使它们用在了不同的地方:

只需要发送字符就可以的话用send()

如果发送字符后还要回车的话,就用 sendline()

特殊变量

pexpect.EOF - 匹配终止信号

pexpect.TIMEOUT - 匹配超时信号

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

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

相关文章

xlwings删除数据_xlwings如何删除行和列?

import xlwings as xwsht[2:2].delete()# 删除行sht[1:2, :].delete() # 区域切片的方法sht[B:B].delete()# 删除列sht[:, 1:2].delete()sht[B2].delete()# 删除单元格 (缺省默认右侧左移left,下侧上移up)sht[C2:D4].delete(up) # 删除区域sht[1:4, 2:4].delete(up)…

怎么实现注解_通透!一口气搞懂注解到底怎么用

日志脱敏场景简介在日志里我们的日志一般打印的是 model 的 Json string,比如有以下 model 类public class Request { /** * 用户姓名 */ private String name; /** * 身份证 */ private String idcard; /** * 手机号 *…

嵌套饼图_你真的了解matplotlib吗?---环形图

环形图简介环形图是饼图衍生出来的统计图形,可以看作是两个以上饼图的叠合。环形图与饼图类似,其实是有差别的。饼图是用圆形及圆内扇形的面积来表示数值大小的图形,主要用于表示总体中各组成部分所占的比例。与之对比,环形图中间…

slim 搭建rnn_使用Keras搭建cnn+rnn, BRNN,DRNN等模型

Keras api 提前知道:Normalize the activations of the previous layer at each batch, i.e. applies a transformation that maintains the mean activation close to 0 and the activation standard deviation close to 1.TimeDistributed, 总的来说TimeDistribut…

JAVA入门级教学之(零基础了解计算机)

JAVA小白入门级教学(零基础了解计算机基础知识) 多动手自己操作,一点一点积累 首先我们了解一下计算机的基础知识 1.计算机构成(基础): 硬件:CPU、内存、硬盘、鼠标、显示器、鼠标等&#x…

oppo 手机侧滑快捷菜单_关于oppo手机菜单键调出的方法,原来是这样的

用OPPO手机朋友们,今天来教大家如何调出手机菜单键。工具/材料OPPO手机操作方法01首先,在手机桌面上找到设置,点击进入。02进入设置找到【面部与密码】,并点击它。03然后点击【关闭密码】,要想设置手机菜单键&#xff…

JAVA入门级教学之(JAVA程序的加载和运行)

JAVA程序的加载和运行 多思考多动脑(边参考文章最后的示意图,边按步骤理解) 1.JAVA程序的加载和运行包括两个非常重要的阶段: 编译阶段运行阶段 2.我们先来了解一下什么是编译阶段: 首先,我们自己动手敲…

abstract类中可以有private的成员_C++|static成员与单例模式

如果需要一个全局对象,如对话框、系统日志、显卡等设备的驱动程序对象、一台PC连接一个键盘等。这样的全局对象只能是一个且是全局的,这就是单例模式,如何实现呢?1 不能在类外部通过构造函数新建对象:构造函数的访问方…

JAVA入门级教学之(JDK安装-JDK、JRE、JVM)

1.下面我们开支安装JDK【JDK开源、免费】 安装地址:https://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html 选择 Windows x64-->jdk-8u221-window-x64.exe 下载 下载完成后 双击JDK安装包-->进入安装界面(…

vim显示python嵌套级_在Vim中为Python突出显示语法

Vim中针对Python的语法突出显示(目标是Ubuntu 12.10)这是有关如何在Ubuntu 12.10的Python中设置语法突出显示的演练。 你所看到的就是你得到的:[https://github.com/sentientmachine/Pretty-Vim-Python/]一旦掌握了如何为特定用户将配色方案和语法突出显示注入到vi编…

JAVA入门级教学之(编写第一个HelloWorld程序)

目录 1.创建一个HelloWorld.java文件 2.用记事本打开HelloWorld.java 3.接下来我们要完成xxx.java-->xxx.class的步骤 怎么解决javac不可用的问题: 4.配置环境变量path 怎么配环境变量Path? 5.接下来就是在DOS命令窗口下进行编译【javac java源…

springboot api文档_SpringCloud/SpringBoot - 自动生成API文档

SpringCloud/SpringBoot 的项目一定要前后分离,这就需要一个API文档生成的工具,后端一定要和前端或者是移动端对接接口,那么问题来了,接口是不是要自己写给他们看,一般的会采用Excel或者Word来写,高级一点的…

JAVA入门级教学之(classpath的配置)

目录 JAVA入门级教学之(classpath的配置) 1.打开DOS命令窗口,执行java HelloWorld 2.疑问?:为什么会出现找不到HelloWorld.class文件? 3.解释: JAVA入门级教学之(classpath的配置…

语法手册_程序员必备——SQL语法速成手册

一、基本概念数据库术语数据库(database) - 保存有组织的数据的容器(通常是一个文件或一组文件)。数据表(table) - 某种特定类型数据的结构化清单。模式(schema) - 关于数据库和表的布局及特性的信息。模式定义了数据在表中如何存储,包含存储什么样的数据&#xff0…

JAVA入门级教学之(JAVA注释)

目录 JAVA入门级教学之(JAVA注释) 1.关于java源程序中的注释: 2.java中的注释怎么写? JAVA入门级教学之(JAVA注释) 1.关于java源程序中的注释: 什么是注释?注释的作用是什么&…

JAVA入门级教学之(你是否理解HelloWorld的这段经典的代码的注释)

//public表示公开的 //class表示一个类 //HelloWorld表示一个类名public class HelloWorld{//表示一个公开的类,类名是HelloWorld//在这个大括号内写的是类体,类体中不能直接编写java语句【除声明变量之外】,否则会报错/*public表示公开的sta…

devtools的ctrl加r_Chrome DevTools调试技巧

【1】DevTools触发伪类右键单击Elements面板中的元素节点并选择“ force state ”。或者在Sytle子窗格中单击“:hov ”图标。可以触发元素上的伪类来研究元素在悬停时的效果和样式​【2】DevTools-在任何网页上运行预定义的代码片段DevTools中有一个叫做代码段的特性…

JAVA入门级教学之(public class和class的区别)

目录 JAVA入门级教学之(public class和class的区别) 1.public class 和 class 的区别: 2.public class 类名A{ }的 类名A需要和源文件 类名 保持一致 总的来说: JAVA入门级教学之(public class和class的区别&…

c 程序中的注释相当于空白字符_Python专题 | (三)注释、变量与输出

小伙伴们,大家好呀,欢迎回到我们的python专题。前两篇文章已经把编程简单的知识和大家介绍过了,今天我们正式开始学习python语法。第一个python程序我们在第一篇文章中介绍pycharm的安装时曾给大家展示过这样的一段代码:print(&qu…

JAVA入门级教学之(第一章总结)

总结第一章需要掌握的内容: 理解java的加载与执行能理解自己搭建的java开发环境(JDK)能够独立编写HelloWorld程序,编译并运行掌握环境变量path的原理以及如何配置掌握环境变量classpath的原理以及如何配置java中的注释public cla…