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 ftp上传文件
Feb 13 Python
Python实现单词翻译功能
Jun 06 Python
Python编程实现正则删除命令功能
Aug 30 Python
详谈Python高阶函数与函数装饰器(推荐)
Sep 30 Python
python 读取目录下csv文件并绘制曲线v111的方法
Jul 06 Python
python开启摄像头以及深度学习实现目标检测方法
Aug 03 Python
解决在pycharm运行代码,调用CMD窗口的命令运行显示乱码问题
Aug 23 Python
python接口自动化如何封装获取常量的类
Dec 24 Python
Python爬虫程序架构和运行流程原理解析
Mar 09 Python
Python如何使用bokeh包和geojson数据绘制地图
Mar 21 Python
pandas参数设置的实用小技巧
Aug 23 Python
简述python&pytorch 随机种子的实现
Oct 07 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使用curl通过代理获取数据的实现方法
2016/05/16 PHP
php preg_match的匹配不同国家语言实例
2016/12/29 PHP
PHP实现APP微信支付的实例讲解
2018/02/10 PHP
DOM 事件流详解
2015/01/20 Javascript
javascript插件开发的一些感想和心得
2016/02/28 Javascript
JavaScript实现Fly Bird小游戏
2016/12/15 Javascript
js使用Replace结合正则替换重复出现的字符串功能示例
2016/12/27 Javascript
Javascript中的getter和setter初识
2017/08/17 Javascript
jQuery实现的简单动态添加、删除表格功能示例
2017/09/21 jQuery
vuex的简单使用教程
2018/02/02 Javascript
使用zrender.js绘制体温单效果
2019/10/31 Javascript
Javascript组合继承方法代码实例解析
2020/04/02 Javascript
Python是编译运行的验证方法
2015/01/30 Python
Python实现字符串反转的常用方法分析【4种方法】
2017/09/30 Python
Python探索之修改Python搜索路径
2017/10/25 Python
python按行读取文件,去掉每行的换行符\n的实例
2018/04/19 Python
python 自动去除空行的实例
2018/07/24 Python
python中时间转换datetime和pd.to_datetime详析
2019/08/11 Python
pygame实现俄罗斯方块游戏(AI篇2)
2019/10/29 Python
python+opencv实现车道线检测
2021/02/19 Python
巧用CSS3的calc()宽度计算做响应模式布局的方法
2018/03/22 HTML / CSS
会走动的图形html5时钟示例
2014/04/27 HTML / CSS
MyHeritage美国:家族史研究和DNA测试的领先服务
2019/05/27 全球购物
个人工作主要事迹
2014/05/08 职场文书
捐助贫困学生倡议书
2014/05/16 职场文书
医学专业毕业生推荐信
2014/07/12 职场文书
暑期培训班招生方案
2014/08/26 职场文书
2014国庆节幼儿园亲子活动方案
2014/09/16 职场文书
升学宴学生致辞
2015/07/27 职场文书
描写九月优美句子(39条)
2019/09/11 职场文书
详解python中[-1]、[:-1]、[::-1]、[n::-1]使用方法
2021/04/25 Python
浅析Python中的随机采样和概率分布
2021/12/06 Python
python pygame 开发五子棋双人对弈
2022/05/02 Python
nginx设置资源请求目录的方式详解
2022/05/30 Servers
Nginx文件已经存在全局反向代理问题排查记录
2022/07/15 Servers
详解Anyscript开发指南绕过typescript类型检查
2022/09/23 Javascript