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实现文件分组复制到不同目录的例子
Jun 04 Python
用Python的Flask框架结合MySQL写一个内存监控程序
Nov 07 Python
Python的几个高级语法概念浅析(lambda表达式闭包装饰器)
May 28 Python
Python实现句子翻译功能
Nov 14 Python
python获取命令行输入参数列表的实例代码
Jun 23 Python
python爬虫基础教程:requests库(二)代码实例
Apr 09 Python
选择python进行数据分析的理由和优势
Jun 25 Python
在Python中使用filter去除列表中值为假及空字符串的例子
Nov 18 Python
Python多线程thread及模块使用实例
Apr 28 Python
python scrapy简单模拟登录的代码分析
Jul 21 Python
Python使用OpenCV实现虚拟缩放效果
Feb 28 Python
Python尝试实现蒙特卡罗模拟期权定价
Apr 21 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
Laravel中基于Artisan View扩展包创建及删除应用视图文件的方法
2016/10/08 PHP
通过修改Laravel Auth使用salt和password进行认证用户详解
2017/08/17 PHP
jquery formValidator插件ajax验证 内容不做任何修改再离开提示错误的bug解决方法
2013/01/04 Javascript
使用原生js实现页面蒙灰(mask)效果示例代码
2014/06/20 Javascript
JavaScript通过this变量快速找出用户选中radio按钮的方法
2015/03/23 Javascript
JS使用ajax从xml文件动态获取数据显示的方法
2015/03/24 Javascript
Bootstrap 附加导航(Affix)插件实例详解
2016/06/01 Javascript
基于Bootstrap的Metronic框架实现条码和二维码的生成及打印处理操作
2016/08/29 Javascript
浅述节点的创建及常见功能的实现
2016/12/15 Javascript
JS高仿抛物线加入购物车特效实现代码
2017/02/20 Javascript
javascript中this用法实例详解
2017/04/06 Javascript
微信小程序 websocket 实现SpringMVC+Spring+Mybatis
2017/08/04 Javascript
Angular实现点击按钮控制隐藏和显示功能示例
2017/12/29 Javascript
详解如何在项目中使用jest测试react native组件
2018/02/09 Javascript
vue同步父子组件和异步父子组件的生命周期顺序问题
2018/10/07 Javascript
layui实现显示数据表格、搜索和修改功能示例
2020/06/03 Javascript
vue路由权限校验功能的实现代码
2020/06/07 Javascript
[07:52]2014DOTA2 TI逗比武士游V社解说背后的故事
2014/07/10 DOTA
python的Template使用指南
2014/09/11 Python
有关Python的22个编程技巧
2018/08/29 Python
win7 x64系统中安装Scrapy的方法
2018/11/18 Python
python模拟登陆,用session维持回话的实例
2018/12/27 Python
Python命令行click参数用法解析
2019/12/19 Python
Virtualenv 搭建 Py项目运行环境的教程详解
2020/06/22 Python
HTML5中在title标题标签里设置小图标的方法
2020/06/23 HTML / CSS
介绍一下游标
2012/01/10 面试题
init进程的作用
2015/08/20 面试题
《玩具柜台前的孩子》教学反思
2014/02/13 职场文书
工程造价专业大学生职业规划范文
2014/03/09 职场文书
事业单位分类改革实施方案
2014/03/21 职场文书
银行授权委托书格式
2014/10/10 职场文书
2015军训通讯稿大全
2015/07/18 职场文书
公司出差管理制度范本
2015/08/05 职场文书
七年级生物教学反思
2016/02/20 职场文书
js之ajax文件上传
2021/05/13 Javascript
Python实战之OpenCV实现猫脸检测
2021/06/26 Python