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解析XML的四种方式
Mar 30 Python
Python端口扫描简单程序
Nov 10 Python
python的pdb调试命令的命令整理及实例
Jul 12 Python
如何用python整理附件
May 13 Python
tensorflow 加载部分变量的实例讲解
Jul 27 Python
在PyCharm导航区中打开多个Project的关闭方法
Jan 17 Python
python IDLE 背景以及字体大小的修改方法
Jul 12 Python
python下PyGame的下载与安装过程及遇到问题
Aug 04 Python
spyder 在控制台(console)执行python文件,debug python程序方式
Apr 20 Python
Python轻量级web框架bottle使用方法解析
Jun 13 Python
python利用 keyboard 库记录键盘事件
Oct 16 Python
Python list和str互转的实现示例
Nov 16 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&mysql(五)
2006/10/09 PHP
在字符串指定位置插入一段字符串的php代码
2010/02/16 PHP
PHP把MSSQL数据导入到MYSQL的方法
2014/12/27 PHP
详解PHP中cookie和session的区别及cookie和session用法小结
2016/06/12 PHP
JSON两种结构之对象和数组的理解
2016/07/19 PHP
php设计模式之观察者模式定义与用法经典示例
2019/09/19 PHP
可缩放Reloaded-一个针对可缩放元素的复用组件
2007/03/10 Javascript
javascript 文档的编码问题解决
2009/03/01 Javascript
一步一步教你写一个jQuery的插件教程(Plugin)
2009/09/03 Javascript
jquery实现动态菜单的实例代码
2013/11/28 Javascript
Node.js插件的正确编写方式
2014/08/03 Javascript
jquery通过closest选择器修改上级元素的方法
2015/03/17 Javascript
个人网站留言页面(前端jQuery编写、后台php读写MySQL)
2016/05/03 Javascript
JavaScript中的数组遍历forEach()与map()方法以及兼容写法介绍
2016/05/19 Javascript
JavaScript动态添加css样式和script标签
2016/07/19 Javascript
解析AngularJS中get请求URL出现的跨域问题
2016/12/01 Javascript
简单谈谈axios中的get,post方法
2017/06/25 Javascript
React + webpack 环境配置的方法步骤
2017/09/07 Javascript
解决linux下node.js全局模块找不到的问题
2018/05/15 Javascript
three.js搭建室内场景教程
2018/12/30 Javascript
jQuery判断自定义属性data-val用法示例
2019/01/07 jQuery
Node.js 中判断一个文件是否存在
2020/08/24 Javascript
使用Python下的XSLT API进行web开发的简单教程
2015/04/15 Python
python fuzzywuzzy模块模糊字符串匹配详细用法
2019/08/29 Python
基于python实现操作redis及消息队列
2020/08/27 Python
CSS3轻松实现清新 Loading 效果的简单实例
2016/06/06 HTML / CSS
大学生演讲稿范文
2014/01/11 职场文书
中级会计职业生涯规划范文
2014/01/16 职场文书
2014年村支部书记四风对照检查材料思想汇报
2014/10/02 职场文书
大班下学期幼儿评语
2014/12/30 职场文书
2015年小学教导处工作总结
2015/05/26 职场文书
餐厅服务员管理制度
2015/08/05 职场文书
给领导敬酒词
2015/08/12 职场文书
2016年大学生暑假爱心支教活动策划书
2015/11/26 职场文书
Python爬虫之用Xpath获取关键标签实现自动评论盖楼抽奖(二)
2021/06/07 Python
分享很少见很有用的SQL功能CORRESPONDING
2022/08/05 MySQL