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 相关文章推荐
50行代码实现贪吃蛇(具体思路及代码)
Apr 27 Python
Python list操作用法总结
Nov 10 Python
Python数据可视化编程通过Matplotlib创建散点图代码示例
Dec 09 Python
详解如何利用Cython为Python代码加速
Jan 27 Python
使用matplotlib中scatter方法画散点图
Mar 19 Python
pyqt5 实现多窗口跳转的方法
Jun 19 Python
Python生成验证码、计算具体日期是一年中的第几天实例代码详解
Oct 16 Python
python进程池实现的多进程文件夹copy器完整示例
Nov 27 Python
python定间隔取点(np.linspace)的实现
Nov 27 Python
python函数调用,循环,列表复制实例
May 03 Python
pycharm激活码2020最新分享适用pycharm2020最新版亲测可用
Nov 22 Python
使用OpenCV校准鱼眼镜头的方法
Nov 26 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学习之数组值的操作
2011/04/17 PHP
openPNE常用方法分享
2011/11/29 PHP
php第一次无法获取cookie问题处理
2014/12/15 PHP
Joomla使用Apache重写模式的方法
2016/05/04 PHP
thinkphp3.2.3 分页代码分享
2016/07/28 PHP
laravel 查询数据库获取结果实现判断是否为空
2019/10/24 PHP
Javascript 写的简单进度条控件
2008/01/22 Javascript
Mootools 1.2教程 同时进行多个形变动画
2009/09/15 Javascript
jQuery前台数据获取实现代码
2011/03/16 Javascript
JS target与currentTarget区别说明
2011/08/28 Javascript
js实现的GridView即表头固定表体有滚动条且可滚动
2014/02/19 Javascript
Jquery给基本控件的取值、赋值示例
2014/05/23 Javascript
原生JS实现旋转木马式图片轮播插件
2016/04/25 Javascript
json传值以及ajax接收详解
2016/05/24 Javascript
BootStrap iCheck插件全选与获取value值的解决方法
2016/08/24 Javascript
jQuery 利用$.ajax 时获取原生XMLHttpRequest 对象的方法
2016/08/25 Javascript
AngularJS 表达式详解及实例代码
2016/09/14 Javascript
JS高仿抛物线加入购物车特效实现代码
2017/02/20 Javascript
javascript canvas检测小球碰撞
2020/04/17 Javascript
Python抓取Discuz!用户名脚本代码
2013/12/30 Python
Python里disconnect UDP套接字的方法
2015/04/23 Python
Python使用dis模块把Python反编译为字节码的用法详解
2016/06/14 Python
Python数据结构与算法之二叉树结构定义与遍历方法详解
2017/12/12 Python
Django中多种重定向方法使用详解
2019/07/17 Python
Python爬取视频(其实是一篇福利)过程解析
2019/08/01 Python
基于Python 中函数的 收集参数 机制
2019/12/21 Python
HTML5实现获取地理位置信息并定位功能
2015/04/25 HTML / CSS
HTML5 Canvas实现360度全景图的示例代码
2018/01/29 HTML / CSS
HTML5实现移动端复制功能
2018/04/19 HTML / CSS
在校硕士自我鉴定
2014/01/23 职场文书
家具促销活动方案
2014/02/16 职场文书
迎元旦广播稿
2014/02/22 职场文书
抗洪救灾先进集体事迹材料
2014/05/26 职场文书
股东出资证明书范例
2014/10/04 职场文书
Java Socket实现多人聊天系统
2021/07/15 Java/Android
关于Python使用turtle库画任意图的问题
2022/04/01 Python