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中的列表生成式与生成器学习教程
Mar 13 Python
Python Sqlite3以字典形式返回查询结果的实现方法
Oct 03 Python
Python中装饰器学习总结
Feb 10 Python
Python日期时间模块datetime详解与Python 日期时间的比较,计算实例代码
Sep 14 Python
让代码变得更易维护的7个Python库
Oct 09 Python
10 行 Python 代码教你自动发送短信(不想回复工作邮件妙招)
Oct 11 Python
Python实现的爬取小说爬虫功能示例
Mar 30 Python
Python实现个人微信号自动监控告警的示例
Jul 03 Python
python使用requests.session模拟登录
Aug 09 Python
Python3之字节串bytes与字节数组bytearray的使用详解
Aug 27 Python
python函数局部变量、全局变量、递归知识点总结
Nov 15 Python
python实现剪贴板的操作
Jul 01 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
ZF等常用php框架中存在的问题
2008/01/10 PHP
PHP中常用的字符串格式化函数总结
2014/11/19 PHP
php基于双向循环队列实现历史记录的前进后退等功能
2015/08/08 PHP
使用JavaScript创建新样式表和新样式规则
2016/06/14 PHP
javascript的事件描述
2006/09/08 Javascript
图片自动缩小的js代码,用以防止图片撑破页面
2007/03/12 Javascript
用javascript实现兼容IE7的类库 IE7_0_9.zip提供下载
2007/08/08 Javascript
ASP.NET jQuery 实例18 通过使用jQuery validation插件校验DropDownList
2012/02/03 Javascript
js中的cookie的读写操作示例详解
2014/04/17 Javascript
Lab.js初次使用笔记
2015/02/28 Javascript
JS实现两表格里数据来回转移的方法
2015/05/28 Javascript
基于JS模仿windows文件按名称排序效果
2016/06/29 Javascript
vue-cli配置环境变量的方法
2018/07/09 Javascript
原生JS实现轮播图效果
2018/10/12 Javascript
[02:57]2014DOTA2国际邀请赛-观众采访
2014/07/19 DOTA
Python通过RabbitMQ服务器实现交换机功能的实例教程
2016/06/29 Python
浅谈Scrapy框架普通反爬虫机制的应对策略
2017/12/28 Python
解决python nohup linux 后台运行输出的问题
2018/05/11 Python
python中的字符串内部换行方法
2018/07/19 Python
Python在图片中插入大量文字并且自动换行
2019/01/02 Python
Python实现的对一个数进行因式分解操作示例
2019/06/27 Python
如何用Python来理一理红楼梦里的那些关系
2019/08/14 Python
Django Model中字段(field)的各种选项说明
2020/05/19 Python
python模块内置属性概念及实例
2021/02/18 Python
CSS3教程:background-clip和background-origin
2008/10/17 HTML / CSS
香港永安旅游网:Wing On Travel
2017/04/10 全球购物
来自圣地亚哥的实惠太阳镜:Knockaround
2018/08/27 全球购物
C语言面试题
2013/05/19 面试题
外贸员简历中的自我评价
2014/03/04 职场文书
房产委托公证书
2014/04/08 职场文书
纪念9.18事变演讲稿
2014/09/14 职场文书
2014领导班子专题民主生活会对照检查材料思想汇报
2014/09/23 职场文书
党员三严三实心得体会
2014/10/13 职场文书
2015年清明节扫墓演讲稿
2015/03/18 职场文书
基于Go Int转string几种方式性能测试
2021/04/28 Golang
Pytorch中expand()的使用(扩展某个维度)
2022/07/15 Python