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系列之新版本导入httplib模块报ImportError解决方案
May 23 Python
python实现文件快照加密保护的方法
Jun 30 Python
解决Pandas to_json()中文乱码,转化为json数组的问题
May 10 Python
Sanic框架蓝图用法实例分析
Jul 17 Python
python实现单链表中删除倒数第K个节点的方法
Sep 28 Python
Python实现去除列表中重复元素的方法总结【7种方法】
Feb 16 Python
PyQt5 在label显示的图片中绘制矩形的方法
Jun 17 Python
Pytorch保存模型用于测试和用于继续训练的区别详解
Jan 10 Python
Python numpy多维数组实现原理详解
Mar 10 Python
如何利用Python识别图片中的文字
May 31 Python
python实现简易自习室座位预约系统
Jun 30 Python
PYTHON 使用 Pandas 删除某列指定值所在的行
Apr 28 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
利用static实现表格的颜色隔行显示的代码
2007/09/02 PHP
php修改上传图片尺寸的方法
2015/04/14 PHP
php实现的pdo公共类定义与用法示例
2017/07/19 PHP
PHP简单实现记录网站访问量功能示例
2018/06/06 PHP
Laravel ORM 数据model操作教程
2019/10/21 PHP
用示例说明filter()与find()的用法以及children()与find()的区别分析
2013/04/26 Javascript
javascript回车完美实现tab切换功能
2014/03/13 Javascript
Angular.js如何从PHP读取后台数据
2016/03/24 Javascript
JavaScript Canvas绘制圆形时钟效果
2020/08/20 Javascript
基于require.js的使用(实例讲解)
2017/09/07 Javascript
jQuery实现checkbox即点即改批量删除及中间遇到的坑
2017/11/11 jQuery
webstorm添加*.vue文件支持
2018/05/08 Javascript
微信小程序新手教程之启动页的重要性
2019/03/03 Javascript
JS实现的简单tab切换功能完整示例
2019/06/20 Javascript
Vue在chrome44偶现点击子元素事件无法冒泡的解决方法
2019/12/15 Javascript
Node.js设置定时任务之node-schedule模块的使用详解
2020/04/28 Javascript
使用 Github Actions 自动部署 Angular 应用到 Github Pages的方法
2020/07/20 Javascript
vue render函数动态加载img的src路径操作
2020/10/26 Javascript
[02:27]DOTA2英雄基础教程 莱恩
2014/01/17 DOTA
python自动化测试之setUp与tearDown实例
2014/09/28 Python
python 3.6 tkinter+urllib+json实现火车车次信息查询功能
2017/12/20 Python
Python爬虫设置代理IP的方法(爬虫技巧)
2018/03/04 Python
python调用百度地图WEB服务API获取地点对应坐标值
2019/01/16 Python
python 监测内存和cpu的使用率实例
2019/11/28 Python
pytorch 模拟关系拟合——回归实例
2020/01/14 Python
通过Python pyecharts输出保存图片代码实例
2020/11/25 Python
《只有一个地球》教学反思
2014/02/14 职场文书
新闻发布会主持词
2014/03/28 职场文书
先进员工获奖感言
2014/08/14 职场文书
小学生勤俭节约演讲稿
2014/08/28 职场文书
医学检验专业自荐信
2014/09/18 职场文书
2014年“向国旗敬礼”网上签名寄语活动方案
2014/09/27 职场文书
工作经历证明书范文
2014/11/02 职场文书
表扬信格式模板
2015/05/05 职场文书
MySQL安装后默认自带数据库的作用详解
2021/04/27 MySQL
Python利用zhdate模块实现农历日期处理
2022/03/31 Python