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之有点简约的元组
Sep 24 Python
python 连接各类主流数据库的实例代码
Jan 30 Python
Python3匿名函数用法示例
Jul 25 Python
Python操作mongodb数据库的方法详解
Dec 08 Python
Python使用psutil获取进程信息的例子
Dec 17 Python
基于plt.title无法显示中文的快速解决
May 16 Python
Python使用pyexecjs代码案例解析
Jul 13 Python
python中_del_还原数据的方法
Dec 09 Python
利用python实现汉诺塔游戏
Mar 01 Python
在pyCharm中下载第三方库的方法
Apr 18 Python
只需要这一行代码就能让python计算速度提高十倍
May 24 Python
Python PIL按比例裁剪图片
May 11 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
判“新”函数:得到今天与明天的秒数
2006/10/09 PHP
PHP+.htaccess实现全站静态HTML文件GZIP压缩传输(一)
2007/02/15 PHP
php empty函数判断mysql表单是否为空
2010/04/12 PHP
php中日期加减法运算实现代码
2011/12/08 PHP
PHP实现限制域名访问的实现代码(本地验证)
2020/09/13 PHP
JQuery获取当前屏幕的高度宽度的实现代码
2011/07/12 Javascript
JS格式化数字保留两位小数点示例代码
2013/10/15 Javascript
jQuery实现按键盘方向键翻页特效
2015/03/18 Javascript
JavaScript通过使用onerror设置默认图像显示代替alt
2016/03/01 Javascript
Vue.js每天必学之过渡与动画
2016/09/06 Javascript
创建一般js对象的几种方式
2017/01/19 Javascript
layui框架中layer父子页面交互的方法分析
2017/11/15 Javascript
详解vue+css3做交互特效的方法
2017/11/20 Javascript
微信小程序如何获取用户手机号
2018/01/26 Javascript
json前后端数据交互相关代码
2018/09/19 Javascript
javascript canvas API内容整理
2020/02/16 Javascript
序列化模块json代码实例详解
2020/03/03 Javascript
jQuery使用jsonp实现百度搜索的示例代码
2020/07/08 jQuery
[02:30]DOTA2英雄基础教程 暗影恶魔
2013/12/17 DOTA
[04:29]2014DOTA2国际邀请赛 主赛事第三日TOPPLAY
2014/07/21 DOTA
Python中的模块导入和读取键盘输入的方法
2015/10/16 Python
Python使用functools实现注解同步方法
2018/02/06 Python
python bmp转换为jpg 并删除原图的方法
2018/10/25 Python
pandas数据集的端到端处理
2019/02/18 Python
Python字符串内置函数功能与用法总结
2019/04/16 Python
详解Python匿名函数(lambda函数)
2019/04/19 Python
python实现接口并发测试脚本
2019/06/25 Python
Python字典fromkeys()方法使用代码实例
2020/07/20 Python
html5各种页面切换效果和模态对话框用法总结
2014/12/15 HTML / CSS
GAP美国官网:美国休闲时尚品牌
2016/08/26 全球购物
Europcar西班牙:全球汽车租赁领域的领导者
2018/09/17 全球购物
Myholidays美国:在线旅游网站
2019/08/16 全球购物
一份报关员的职业规划范文
2014/01/08 职场文书
2014年清明节网上祭英烈寄语
2014/04/09 职场文书
厨房领班竞聘演讲稿
2014/04/23 职场文书
Python中三种花式打印的示例详解
2022/03/19 Python