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的Django框架中simple-todo工具的简单使用
May 30 Python
Mac中Python 3环境下安装scrapy的方法教程
Oct 26 Python
Python中判断输入是否为数字的实现代码
May 26 Python
Python使用jsonpath-rw模块处理Json对象操作示例
Jul 31 Python
python实现排序算法解析
Sep 08 Python
利用python循环创建多个文件的方法
Oct 25 Python
详解python实现小波变换的一个简单例子
Jul 18 Python
使用OpenCV实现仿射变换—缩放功能
Aug 29 Python
python扫描线填充算法详解
Feb 19 Python
Keras自定义IOU方式
Jun 10 Python
Python基础之常用库常用方法整理
Apr 30 Python
对象析构函数__del__在Python中何时使用
Mar 22 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 jsonp单引号转义
2014/11/23 PHP
PHP Web木马扫描器代码分享
2015/09/06 PHP
laravel withCount 统计关联数量的方法
2019/10/10 PHP
Web版彷 Visual Studio 2003 颜色选择器
2007/01/09 Javascript
jquery实现商品拖动选择效果代码(自写)
2013/05/28 Javascript
jQuery支持添加事件的日历特效代码分享(3种样式)
2015/08/24 Javascript
关注jquery技巧提高jquery技能(前端开发必学)
2015/11/02 Javascript
angularjs自定义ng-model标签的属性
2016/01/21 Javascript
VUEJS实战之修复错误并且美化时间(2)
2016/06/13 Javascript
Ajax+FormData+javascript实现无刷新表单信息提交
2016/10/24 Javascript
详解VueJS 数据驱动和依赖追踪分析
2017/07/26 Javascript
使用Node.js实现RESTful API的示例
2017/08/01 Javascript
微信小程序实现下拉菜单切换效果
2020/03/30 Javascript
JS实现使用POST方式发送请求
2019/08/30 Javascript
vue使用svg文件补充-svg放大缩小操作(使用d3.js)
2020/09/22 Javascript
python爬虫入门教程之点点美女图片爬虫代码分享
2014/09/02 Python
pygame加载中文名mp3文件出现error
2017/03/31 Python
Python实现抢购IPhone手机
2018/02/07 Python
PyQt5实现下载进度条效果
2018/04/19 Python
python绘制立方体的方法
2018/07/02 Python
浅谈python的elementtree模块处理中文注意事项
2020/03/06 Python
Pycharm2020最新激活码|永久激活(附最新激活码和插件的详细教程)
2020/09/29 Python
使用numpngw和matplotlib生成png动画的示例代码
2021/01/24 Python
解决Pycharm 运行后没有输出的问题
2021/02/05 Python
css3动画过渡实现鼠标跟随导航效果
2018/02/08 HTML / CSS
艺龙旅行网酒店预订:国内、港澳台酒店
2018/06/26 全球购物
Ooni英国官网:披萨烤箱
2020/05/31 全球购物
科室工作的个人自我评价
2013/10/30 职场文书
综合办公室个人的自我评价
2013/12/22 职场文书
会计与审计毕业生自荐信范文
2013/12/30 职场文书
社区党总支书记先进事迹材料
2014/01/24 职场文书
办公室秘书岗位职责范本
2014/02/11 职场文书
党员教师个人对照检查材料范文
2014/09/25 职场文书
关于安全的广播稿
2014/10/23 职场文书
2015年加油站工作总结
2015/05/13 职场文书
JS数组去重详情
2021/11/07 Javascript