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局域网ip扫描示例分享
Apr 03 Python
python获取本机mac地址和ip地址的方法
Apr 29 Python
安装ElasticSearch搜索工具并配置Python驱动的方法
Dec 22 Python
python3+PyQt5实现使用剪贴板做复制与粘帖示例
Jan 24 Python
Python实现控制台中的进度条功能代码
Dec 22 Python
Python中文件的读取和写入操作
Apr 27 Python
python实现杨氏矩阵查找
Mar 02 Python
python按比例随机切分数据的实现
Jul 11 Python
python英语单词测试小程序代码实例
Sep 09 Python
pandas使用之宽表变窄表的实现
Apr 12 Python
如何将json数据转换为python数据
Sep 04 Python
关于python3.9安装wordcloud出错的问题及解决办法
Nov 02 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调用云片网接口发送短信的实现方法
2017/10/25 PHP
PHP实现动态压缩js与css文件的方法
2018/05/02 PHP
JavaScript中数组对象的那些自带方法介绍
2013/03/12 Javascript
禁用页面部分JavaScript不是全部而是部分
2014/09/03 Javascript
html的DOM中Event对象onabort事件用法实例
2015/01/21 Javascript
jQuery匹配文档链接并添加class的方法
2015/06/26 Javascript
jqTransform美化表单
2015/10/10 Javascript
百度搜索框智能提示案例jsonp
2016/11/28 Javascript
ionic2 tabs使用 Modal底部tab弹出框
2016/12/30 Javascript
详解Vue.js分发之作用域槽
2017/06/13 Javascript
详解基于node的前端项目编译时内存溢出问题
2017/08/01 Javascript
javascript异步处理与Jquery deferred对象用法总结
2019/06/04 jQuery
vue简单封装axios插件和接口的统一管理操作示例
2020/02/02 Javascript
javascript实现页面的实时时钟显示示例
2020/08/06 Javascript
[06:04]DOTA2国际邀请赛纪录片:Just For LGD
2013/08/11 DOTA
[05:06]TI4西雅图DOTA2前线报道 海涛密探LGD训练
2014/07/09 DOTA
[01:50:49]DOTA2-DPC中国联赛 正赛 PSG.LGD vs Aster BO3 第三场 1月24日
2021/03/11 DOTA
Python中的字符串类型基本知识学习教程
2016/02/04 Python
Python实现TCP协议下的端口映射功能的脚本程序示例
2016/06/14 Python
Python for循环生成列表的实例
2018/06/15 Python
python bmp转换为jpg 并删除原图的方法
2018/10/25 Python
python中类的属性和方法介绍
2018/11/27 Python
Python3.5迭代器与生成器用法实例分析
2019/04/30 Python
python实现高斯投影正反算方式
2020/01/17 Python
Tensorflow获取张量Tensor的具体维数实例
2020/01/19 Python
Pytorch数据拼接与拆分操作实现图解
2020/04/30 Python
Vans(范斯)新西兰官方网站:美国原创极限运动品牌
2020/09/19 全球购物
草莓网中国:StrawberryNet中国
2020/08/17 全球购物
人事部主管岗位职责
2013/12/26 职场文书
秋季红领巾广播稿
2014/01/27 职场文书
运动会致辞稿50字
2014/02/04 职场文书
学生打架检讨书
2014/02/14 职场文书
学校领导班子成员查摆问题及整改措施
2014/10/28 职场文书
铣工实训报告
2014/11/05 职场文书
《圆的周长》教学反思
2016/02/17 职场文书
PyCharm 配置SSH和SFTP连接远程服务器
2022/05/11 Python