大家好,最近工作比较忙,所以没时间来更新博客。趁着还没在下个版本来临之前,来这边再更新更新。是之前学习到的一些老知识点,就当来巩固一下了。开心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.
""" import pexpect
import getpass, os #user: ssh 主机的用户名
#host:ssh 主机的域名
#password:ssh 主机的密码
#command:即将在远端 ssh 主机上运行的命令
def ssh_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:'
print child.before, child.after
return None
# 如果 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:'
print child.before, child.after
return None
# 输入密码.
child.sendline(password)
return child def main ():
# 获得用户指定 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)
# 输出命令结果.
print child.before if __name__ == '__main__':
try:
main()
except Exception, e:
print str(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 - 匹配超时信号

python--pexpect的更多相关文章

  1. Python Pexpect库的简单使用

    Python Pexpect库的使用 简介 最近需要远程操作一个服务器并执行该服务器上的一个python脚本,查到可以使用Pexpect这个库.记录一下. 什么是Pexpect?Pexpect能够产生 ...

  2. python pexpect 学习与探索

    pexpect是python交互模块,有两种使用方法,一种是函数:run另外一种是spawn类 1.pexpect  module 安装 pexpect属于第三方的,所以需要安装, 目前的版本是 3. ...

  3. python pexpect总结

    基本使用流程 pexpect 的使用说来说去,就是围绕3个关键命令做操作: 首先用 spawn 来执行一个程序 然后用 expect 来等待指定的关键字,这个关键字是被执行的程序打印到标准输出上面的 ...

  4. Python pexpect出现错误‘module have no attribute "spawn" 解决办法

    今天我遇到了这个错误,现在将错误总结如下: 1.首先查询一下自己的操作系统,pexpect中的spawn()和run()仅仅运行在POSIX系统上,在WINDOWS下是没有这两个东西的,在官网http ...

  5. python pexpect包的一些用法

    转自:https://www.jianshu.com/p/cfd163200d12 mark一下,原文中写的挺详细

  6. Python:渗透测试开源项目

    Python:渗透测试开源项目[源码值得精读] sql注入工具:sqlmap DNS安全监测:DNSRecon 暴力破解测试工具:patator XSS漏洞利用工具:XSSer Web服务器压力测试工 ...

  7. Python:渗透测试开源项目【源码值得精读】

    sql注入工具:sqlmap DNS安全监测:DNSRecon 暴力破解测试工具:patator XSS漏洞利用工具:XSSer Web服务器压力测试工具:HULK SSL安全扫描器:SSLyze 网 ...

  8. Python代码样例列表

    扫描左上角二维码,关注公众账号 数字货币量化投资,回复“1279”,获取以下600个Python经典例子源码 ├─algorithm│       Python用户推荐系统曼哈顿算法实现.py│    ...

  9. pexpect获取远端命令执行结果

    类比于shell的expect, python中使用pexpect模块来模拟用户和终端交互.有的时候使用pexpect.sendline发送命令后,在各种条件影响下, 可能并不能保证命令在远端服务器执 ...

  10. python之pexpect模块

    最近在看<Python自动化运维技术与最佳实战>这本书,学到了一个运维中用到的模块:pexpect 下面是其定义: Pexpect 是一个用来启动子程序并对其进行自动控制的 Python ...

随机推荐

  1. join() 和 sleep() 区别

    来源于<Java多线程编程核心技术> 一.join() 作用 在很多情况,主线程创建并启动子线程,如果子线程中需要进行大量的耗时计算,主线程往往早于子线程结束.这时,如果主线程想等待子线程 ...

  2. Day4下午

    不会啊. T1 找规律: 辗转相减,加速. #include<iostream> #include<cstring> #include<cstdio> #inclu ...

  3. input type="image" 提交表单

    提到<input type="image"  />,说起来有些惭愧.之前的工作基本每周都要制作两到三个注册用户的网页.其中就用它提交表单. 那个时候我想当然的以为这是用 ...

  4. 位运算(1)——Hamming Distance

    https://leetcode.com/problems/hamming-distance/#/description 输入:两个整数x,y,且0 ≤ x, y < 231. 输出:x,y的二 ...

  5. Struts2_Struts标签大致内容

    Struts-Tags1.通用标签 a) property b) set i.默认为 action scope,会将值放入 request 和 ActionContext中 ii. page.requ ...

  6. 数组模拟栈(C语言)

    用数组模拟栈的实现: #include <stdio.h> #include <stdlib.h> #define STACK_SIZE 100 typedef struct ...

  7. MySQL报错:Packets larger than max_allowed_packet are not all

    MySQL根据配置文件会限制Server接受的数据包大小.有时候大的插入和更新会受 max_allowed_packet 参数限制,导致写入或者更新失败. 修改方法: 1.修改配置文件my.ini m ...

  8. 修改FileZilla(FTP客户端)同时传输的文件数

    在菜单中点击“编辑”.“设置”,按照以下步骤操作:

  9. php之判断点在多边形内的api

    1.判断点在多边形内的数学思想:以那个点为顶点,作任意单向射线,如果它与多边形交点个数为奇数个,那么那个点在多边形内,相关公式: <?php class AreaApi{ //$area是一个多 ...

  10. Selenium入门18 断言

    自动化测试需对比实际结果与预期结果,给出测试结论. 1 条件判断 if ...else... 2 assert ... #coding:utf-8 #断言 from selenium import w ...