- 本书赞誉
- 前言
- 第一部分 基础篇
- 第1章 系统基础信息模块详解
- 第2章 业务服务监控详解
- 第3章 定制业务质量报表详解
- 第4章 Python 与系统安全
- 第二部分 高级篇
- 第5章 系统批量运维管理器 pexpect 详解
- 第6章 系统批量运维管理器 paramiko 详解
- 第7章 系统批量运维管理器Fabric详解
- 第8章 从零开发一个轻量级 WebServer
- 第9章 集中化管理平台 Ansible 详解
- 第10章 集中化管理平台 Saltstack 详解
- 第11章 统一网络控制器 Func 详解
- 第12章 Python 大数据应用详解
- 第三部分 案例篇
- 第13章 从零开始打造 B/S 自动化运维平台
- 第14章 打造 Linux 系统安全审计功能
- 第15章 构建分布式质量监控平台
- 第16章 构建桌面版 C/S 自动化运维平台
文章来源于网络收集而来,版权归原创者所有,如有侵权请及时联系!
5.3 pexpect 应用示例
下面介绍两个通过pexpect实现自动化操作的示例,其中一个实现FTP协议的自动交互,另一个为SSH协议自动化操作,这些都是日常运维中经常遇到的场景。
5.3.1 实现一个自动化FTP操作
我们常用FTP协议实现自动化、集中式的文件备份,要求做到账号登录、文件上传与下载、退出等实现自动化操作,本示例使用pexpect模块的spawnu方法执行FTP命令,通过expect方法定义匹配的输出规则,sendline方法执行相关FTP交互命令等,详细源码如下:
【/home/test/pexpect/simple2.py】
from __future__ import unicode_literals #使用unicode编码 import pexpect import sys child = pexpect.spawnu('ftp ftp.openbsd.org') #运行ftp命令 child.expect('(?i)name .*: ') #(?i)表示后面的字符串正则匹配忽略大小写 child.sendline('anonymous') #输入ftp账号信息 child.expect('(?i)password') #匹配密码输入提示 child.sendline('pexpect@sourceforge.net') #输入ftp密码 child.expect('ftp> ') child.sendline('bin') #启用二进制传输模式 child.expect('ftp> ') child.sendline('get robots.txt') #下载robots.txt文件 child.expect('ftp> ') sys.stdout.write (child.before) #输出匹配“ftp> ”之前的输入与输出 print("Escape character is '^]'.\n") sys.stdout.write (child.after) sys.stdout.flush #调用 interact让出控制权,用户可以继续当前的会话手工控制子程序,默认输入“^]”字符跳出 child.interact child.sendline('bye') child.close
运行结果如下:
get robots.txt local: robots.txt remote: robots.txt 227 Entering Passive Mode (129,128,5,191,197,243) 150 Opening BINARY mode data connection for 'robots.txt' (26 bytes). 226 Transfer complete. 26 bytes received in 3.29 secs (0.01 Kbytes/sec) Escape character is '^]'. ftp> #调用interact控制项让出,用户可以手工进行交互
5.3.2 远程文件自动打包并下载
在Linux系统集群运营当中,时常需要批量远程执行Linux命令,并且双向同步文件的操作。本示例通过使用spawn方法执行ssh、scp命令的思路来实现,具体实现源码如下:
【/home/test/pexpect/simple3.py】
import pexpect import sys ip="192.168.1.21" #定义目标主机 user="root" #目标主机用户 passwd="H6DSY#*$df32" #目标主机密码 target_file="/data/logs/nginx_access.log" #目标主机nginx日志文件 child = pexpect.spawn('/usr/bin/ssh', [user+'@'+ip]) #运行ssh命令 fout = file('mylog.txt','w') #输入、输出日志写入mylog.txt文件 child.logfile = fout try: child.expect('(?i)password') #匹配password字符串,(?i)表示不区别大小写 child.sendline(passwd) child.expect('#') child.sendline('tar -czf /data/nginx_access.tar.gz '+target_file) #打包nginx #日志文件 child.expect('#') print child.before child.sendline('exit') fout.close except EOF: #定义EOF异常处理 print "expect EOF" except TIMEOUT: #定义TIMEOUT异常处理 print "expect TIMEOUT" child = pexpect.spawn('/usr/bin/scp', [user+'@'+ip+':/data/nginx_access.tar.gz','/home']) #启动scp远程拷贝命令,实现将打包好的nginx日复制至本地/home目录 fout = file('mylog.txt','a') child.logfile = fout try: child.expect('(?i)password') child.sendline(passwd) child.expect(pexpect.EOF) #匹配缓冲区EOF(结尾),保证文件复制正常完成 except EOF: print "expect EOF" except TIMEOUT: print "expect TIMEOUT"
参考提示 5.2节和5.3节常用类说明与应用案例参考http://pexpect.readthedocs.org/en/latest/。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论