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中的二进制位运算符
May 13 Python
一个基于flask的web应用诞生 bootstrap框架美化(3)
Apr 11 Python
Python实现统计文本文件字数的方法
May 05 Python
Python numpy实现数组合并实例(vstack,hstack)
Jan 09 Python
Python动态导入模块的方法实例分析
Jun 28 Python
Python设计模式之适配器模式原理与用法详解
Jan 15 Python
在Pycharm中对代码进行注释和缩进的方法详解
Jan 20 Python
python 实现将多条曲线画在一幅图上的方法
Jul 07 Python
django的csrf实现过程详解
Jul 26 Python
python opencv 图像边框(填充)添加及图像混合的实现方法(末尾实现类似幻灯片渐变的效果)
Mar 09 Python
python 写函数在一定条件下需要调用自身时的写法说明
Jun 01 Python
Django中使用Json返回数据的实现方法
Jun 03 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
php做下载文件的实现代码及文件名中乱码解决方法
2011/02/03 PHP
兼容PHP和Java的des加密解密代码分享
2014/06/26 PHP
PHP判断文章里是否有图片的简单方法
2014/07/26 PHP
PHP 实现页面静态化的几种方法
2017/07/23 PHP
PHP实现通过strace定位故障原因的方法
2018/04/29 PHP
详细讲解JS节点知识
2010/01/31 Javascript
JS 跳转页面延迟2种方法
2013/03/29 Javascript
JQuery以JSON方式提交数据到服务端示例代码
2014/05/05 Javascript
javascript中数组array及string的方法总结
2014/11/28 Javascript
windows8.1+iis8.5下安装node.js开发环境
2014/12/12 Javascript
jQuery插件ImageDrawer.js实现动态绘制图片动画(附源码下载)
2016/02/25 Javascript
浅谈JavaScript 函数参数传递到底是值传递还是引用传递
2016/08/23 Javascript
node.js 核心http模块,起一个服务器,返回一个页面的实例
2017/09/11 Javascript
JS封装的模仿qq右下角消息弹窗功能示例
2018/08/22 Javascript
JavaScript递归函数定义与用法实例分析
2019/01/24 Javascript
浅谈Vue的响应式原理
2019/05/30 Javascript
微信公众号服务器验证Token步骤图解
2019/12/30 Javascript
vue项目中使用bpmn为节点添加颜色的方法
2020/04/30 Javascript
JS实现购物车基本功能
2020/11/08 Javascript
python中django框架通过正则搜索页面上email地址的方法
2015/03/21 Python
python中numpy的矩阵、多维数组的用法
2018/02/05 Python
python调用百度语音识别实现大音频文件语音识别功能
2018/08/30 Python
tensorflow使用range_input_producer多线程读取数据实例
2020/01/20 Python
解决pyqt5异常退出无提示信息的问题
2020/04/08 Python
使用python画出逻辑斯蒂映射(logistic map)中的分叉图案例
2020/12/11 Python
使用Python下载抖音各大V视频的思路详解
2021/02/06 Python
美国健康和保健平台:healtop
2020/07/02 全球购物
英国Lookfantastic中文网站:护肤品美妆美发购物(英国直邮)
2020/04/27 全球购物
个人求职信范例
2014/01/29 职场文书
小学美术教学反思
2014/02/01 职场文书
开展批评与自我批评发言材料
2014/05/15 职场文书
学习三严三实心得体会
2014/10/13 职场文书
大学生自荐材料范文
2014/12/30 职场文书
python自动化调用百度api解决验证码
2021/04/13 Python
Django一小时写出账号密码管理系统
2021/04/29 Python
新手入门Jvm-- JVM对象创建与内存分配机制
2021/06/18 Java/Android