大家好,最近工作比较忙,所以没时间来更新博客。趁着还没在下个版本来临之前,来这边再更新更新。是之前学习到的一些老知识点,就当来巩固一下了。开心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. AJAX重点知识的心得体会

    下面就为大家带来一篇 AJAX重点知识的心得体会.学习还是有点帮助的,给大家做个参考吧. AJAX是什么? 是Asynchronous Javascript And XML的首字母的缩写, 它不是一门 ...

  2. nopcommerce3.6中文包

    nopCommerce 语言包,xml文件 点击下载:3.60_language_pack_zh.rar (60.82 kb) 下载后解压通过后台导入即可使用.如何导入?点击这里

  3. Mybatis通用Mapper(转)

    转自:http://blog.csdn.net/isea533/article/details/41457529 极其方便的使用Mybatis单表的增删改查 项目地址:http://git.oschi ...

  4. Python数据报协议以及sockersever模块的使用

    一.基于UDP协议的套接字 UDP协议 UDP 是User Datagram Protocol的简称, 中文名是用户数据报协议,是OSI(Open System Interconnection,开放式 ...

  5. HihoCoder#1509 : 异或排序(二进制)

    题意 题目链接 Sol 挺简单的吧.考虑两个元素什么时候不满足条件 设\(a_i\)与\(a_i + 1\)最高的不同位分别为0 1,显然\(S\)的这一位必须为\(0\),否则这一位必须为\(1\) ...

  6. Limesurvey-2.55 (Ubuntu 16.04)

    平台: Ubuntu 类型: 虚拟机镜像 软件包: limesurvey-2.55 business intelligence commercial limesurvey open-source 服务 ...

  7. JAVA StringBuffer的用法

    在使用StringBuffer 的时候,习惯性的像String一样把他初始化了 StringBuffer result = null; 结果警告:Null pointer access: The va ...

  8. http缓存基本介绍

    https://www.helloweba.com/view-blog-414.html

  9. CentOS6下DHCP服务(一)工作原理及安装配置说明

    1.DHCP服务用途 DHCP是Dynamic Host Configuration Protocol的简写,DHCP服务器最主要的工作就是自动地将网络参数分配给网络中的每台计算机,让客户端的计算机在 ...

  10. Vim中根据正则对选中文本对齐(比如ini文件的=号对齐)

    vimrc增加如下内容即可: vnoremap <M-=> :call Duiqi('\v(^\s*\S+)\s+(.*)')<CR> "reg匹配的第2段文字对齐 ...