Python安装使用命令行交互模块pexpect的基础教程


Posted in Python onMay 12, 2016

一、安装
1、安装easy_install工具

wget http://peak.telecommunity.com/dist/ez_setup.py

python ez_setup.py 安装easy_install工具(这个脚本会自动去官网搜索下载并安装)

python ez_setup.py -U setuptools

升级easy_install工具

2、安装pexpect

easy_install Pexpect

测试一下:

[root@OMS python]# python
Python 2.7.3rc1 (default, Nov 7 2012, 15:03:45)
[GCC 4.1.2 20080704 (Red Hat 4.1.2-48)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import pexpect
>>> import pxssh
>>>

ok已经安装完成。

二、基本用法
1.run()函数
run功能相对简单,只能实现简单交互

run(command,timeout=-1,withexitstatus=False,events=None,extra_args=None, logfile=None, cwd=None, env=None)

run运行命令,然后返回结果,与os.system类似.
示例:
pexpect.run('ls -la')
# 返回值(输出,退出状态)
(command_output, exitstatus) = pexpect.run('ls -l /bin', withexitstatus=1)
2.spawn类
spawn功能比run强大,可以实现更复杂交互
class spawn 
  __init__(self, command, args=[], timeout=30, maxread=2000, searchwindowsize=None, logfile=None, cwd=None, env=None)
timeout指定交互是等待的超时值;
maxread设置read buffer大小. 每次pexpect尝试从TTY(Teletype终端)从读取的最大字节数;
searchwindowsize 指定了从输入缓冲区中进行模式匹配的位置,默认从开始匹配;
logfile 参数指定日志的记录位置。
工作过程:
# 第一步与终端建立连接
child = pexpect.spawn('scp foo user@example.com:.')
# 第二步等待终端返回特定内容
child.expect('Password:')
# 第三步根据返回内容发送命令进行交互
child.sendline(mypassword)

3.pxssh类
pxssh是pexpect的派生类,用于建立ssh连接,比pexpect好用。

login()  建立到目标机器的ssh连接;
logout() 释放该连接;
prompt() 等待提示符,通常用于等待命令执行结束。

三、实例
写一个脚本给远程服务器发送命令,并返回结果。
脚本内容:

#!/usr/bin/python 
#2013-01-16 by larry 
import pexpect 
def login(port,user,passwd,ip,command): 
  child=pexpect.spawn('ssh -p%s %s@%s "%s"' %(port,user,ip,command)) 
  o='' 
  try: 
    i=child.expect(['[Pp]assword:','continue connecting (yes/no)?']) 
    if i == 0: 
      child.sendline(passwd) 
    elif i == 1: 
      child.sendline('yes') 
    else: 
      pass 
  except pexpect.EOF: 
    child.close() 
  else: 
    o=child.read() 
    child.expect(pexpect.EOF) 
    child.close() 
  return o 
 
hosts=file('hosts.list','r') 
for line in hosts.readlines(): 
  host=line.strip("\n") 
  if host: 
    ip,port,user,passwd,commands= host.split(":") 
    for command in commands.split(","): 
      print "+++++++++++++++ %s run:%s ++++++++++++" % (ip,command), 
      print login(port,user,passwd,ip,command)  
hosts.close()

使用方法:

python scripts.py

host.list文件内容如下:

192.168.0.21:22999:root:123456:cat /etc/redhat-release,df -Th,whoami
192.168.0.21:22999:root:123456:cat /etc/redhat-release,df -Th,whoami

返回结果:

+++++++++++++++ 192.168.0.21 run:cat /etc/redhat-release ++++++++++++
Red Hat Enterprise Linux Server release 4
+++++++++++++++ 192.168.0.21 run:df -Th ++++++++++++
文件系统   类型  容量 已用 可用 已用% 挂载点
/dev/cciss/c0d0p6
ext3  5.9G 4.4G 1.2G 80% /
/dev/cciss/c0d0p7
ext3  426G 362G  43G 90% /opt
/dev/cciss/c0d0p5
ext3  5.9G 540M 5.0G 10% /var
/dev/cciss/c0d0p3
ext3  5.9G 4.1G 1.5G 74% /usr
/dev/cciss/c0d0p1
ext3  487M  17M 445M  4% /boot
tmpfs    tmpfs  4.0G   0 4.0G  0% /dev/shm
+++++++++++++++ 192.168.0.21 run:whoami ++++++++++++
root
Python 相关文章推荐
Python获取linux主机ip的简单实现方法
Apr 18 Python
Python用Bottle轻量级框架进行Web开发
Jun 08 Python
Python实现字符串的逆序 C++字符串逆序算法
May 28 Python
Python创建普通菜单示例【基于win32ui模块】
May 09 Python
使用python进行拆分大文件的方法
Dec 10 Python
在python中利用opencv简单做图片比对的方法
Jan 24 Python
Django中自定义查询对象的具体使用
Oct 13 Python
python数据库编程 ODBC方式实现通讯录
Mar 27 Python
Python实现电视里的5毛特效实例代码详解
May 15 Python
PIL.Image.open和cv2.imread的比较与相互转换的方法
Jun 03 Python
pyqt5 textEdit、lineEdit操作的示例代码
Aug 12 Python
pycharm2020.1.2永久破解激活教程,实测有效
Oct 29 Python
Python下载指定页面上图片的方法
May 12 #Python
Python基于二分查找实现求整数平方根的方法
May 12 #Python
python二分查找算法的递归实现方法
May 12 #Python
Python数据类型详解(四)字典:dict
May 12 #Python
Python匹配中文的正则表达式
May 11 #Python
Python3使用requests发闪存的方法
May 11 #Python
Python3控制路由器——使用requests重启极路由.py
May 11 #Python
You might like
评分9.0以上的动画电影,剧情除了经典还很燃
2020/03/04 日漫
上海无线电三厂简史修改版
2021/03/01 无线电
类的另类用法--数据的封装
2006/10/09 PHP
如何突破PHP程序员的技术瓶颈分析
2011/07/17 PHP
PHP实现随机生成水印图片功能
2017/03/22 PHP
Ext grid 添加右击菜单
2009/11/26 Javascript
基于jquery的一个浮动框(扩展性比较好 )
2010/08/27 Javascript
jquery键盘事件介绍
2011/01/31 Javascript
js实现带搜索功能的下拉框实时搜索实时匹配
2013/11/05 Javascript
document.forms用法示例介绍
2014/06/26 Javascript
jQuery子属性过滤选择器用法分析
2015/02/10 Javascript
完美兼容多浏览器的js判断图片路径代码汇总
2015/04/17 Javascript
bootstrap 下拉多选框进行多选传值问题代码分析
2017/02/14 Javascript
vue2组件实现懒加载浅析
2017/03/29 Javascript
mongoose中利用populate处理嵌套的方法
2017/05/26 Javascript
解决html input验证只能输入数字,不能输入其他的问题
2017/07/21 Javascript
使用JS和canvas实现gif动图的停止和播放代码
2017/09/01 Javascript
template.js前端模板引擎使用详解
2017/10/10 Javascript
js找出5个数中最大的一个数和倒数第二大的数实现方法示例小结
2020/03/04 Javascript
vue 使用localstorage实现面包屑的操作
2020/11/16 Javascript
Python实现堆排序的方法详解
2016/05/03 Python
Python跨文件全局变量的实现方法示例
2017/12/10 Python
python保存数据到本地文件的方法
2018/06/23 Python
Django之编辑时根据条件跳转回原页面的方法
2019/08/21 Python
简单了解Python write writelines区别
2020/02/27 Python
Trip.com香港网站:Ctrip携程旗下,全球最大的网上旅游社之一
2016/08/01 全球购物
超30万乐谱下载:Musicnotes.com
2016/09/24 全球购物
Mytheresa英国官网:拥有160多个奢侈品品牌
2016/10/09 全球购物
为什么要优先使用同步代码块而不是同步方法?
2013/01/30 面试题
在浏览器端如何得到服务器端响应的XML数据
2012/11/24 面试题
标准版离职证明书
2014/09/12 职场文书
党的群众路线教育实践活动总结材料
2014/10/30 职场文书
雨中的树观后感
2015/06/03 职场文书
诚实守信主题班会
2015/08/13 职场文书
八年级数学教学反思
2016/02/17 职场文书
Mysql外键约束的创建与删除的使用
2022/03/03 MySQL