Python之——系统批量运维管理器pexpect

一、pexpect的安装

pexpect作为Python的一个普通模块,可以通过pip安装,也可以通过源码安装

1、pip安装

pip install pexpect
easy_install pexpect
2、源码安装
wget https://github.com/pexpect/pexpect.git
cd pexpect
python setup.py install

二、pexpect的核心组件

pexpect包含的核心组件有:spawn类、run函数及派生类pxssh等的定义及使用方法。
1、spawn类
spawn是pexpect的主要类接口,功能是启动和控制子应用程序,以下是它的构造函数定义:
class pexpect.spawn(command, args=[], timeout=30, maxread=2000, searchwindowsize=None, logfile=None, cwd=None, env=None, ignore_sighup=True)
其中command参数可以是任意已知的系统命令,如:
child = pexpect.spawn('/usr/bin/ftp') #启动ftp客户端命令
child = pexpect.spawn('/usr/bin/ssh ip')   #启动ssh远程连接命令
child = pexpect.spawn('ls -latr /tmp')  #运行ls显示/tmp目录内容命令
当子程序需要参数时,还可以使用Python列表来代替参数项,如:
child = pexpect.spawn('/usr/bin/ftp', []) 
child = pexpect.spawn('/usr/bin/ssh', [ip])
child = pexpect.spawn('ls',['-latr', '/tmp']) 
参数timeout为等待结果的超时时间;参数maxread为pexpect从终端控制台一次读取的最大字节数,searchwindowsize参数为匹配缓冲字符串的位置,默认是从开始位置匹配。
需要注意的是,pexpect不会解析shell命令当中的元字符,包括重定向 > 、管道 | 或通配符 * , 我们可以通过将存在这三个特殊元字符的命令作为/bin/bash的参数进行调用,例如:
child = pexpect.spawn('/bin/bash -c "ls -l | grep LOG > logs.txt"')
child.expect(pexpect.EOF)
我们可以通过将命令的参数以Python列表的形式进行替换,从而使我们的语法变成更加清晰,下面的代码等价于上面的。
shell_cmd  = 'ls -l | grep LOG > logs.txt'
child = pexpect.spawn('/bin/bash', ['-c', shell_cmd])
child.expect(pexpect.EOF)
此外,pexpect支持日志输出,可以输出到控制台,也可以输出到文件
1)输出到标准输出
child = pexpect.spwn('some_command')
child.logfile = sys.stdout
2)输出到文件
child = pexpect.spwn('some_command')
fout = file('log.txt', 'w')
child.logfile = fout
2、run函数

函数定义:

pexpect.run(command, timeout=-1, withexitstatus=False,events=NOne,extra_args=None,logfile=None,cwd=None,evn=None)
参数command可以是系统已知的任意命令,如没有写绝对路径时将会尝试搜索命令的路径,events是一个字典,定义了expect及sendline方法的对应关系,spawn方式例子如下:
from pexpect import *
child = spawn('scp foo ip:.')
child.expect('(?i)password')
child.sendline(mypassword)
使用run函数如下
from pexpect import *
run('scp foo ip:.', event={'(?i)password' : mypassword})
3、pxssh类
pxssh类定义

class pexpect.pxssh.pxssh(timeout=30,maxread=2000,searchwindowsize=None,logfile=None,cwd=None,evn=None)
常用的方法如下:
login()建立ssh连接
logout()断开连接
prompt()等待系统提示符,用户等待命令执行结束.
下面使用pxssh类实现一个ssh连接远程主机并执行命令的示例。首先使用login()方法与远程主机建立连接,再通过sendline方法发送执行的命令,prompt()方法等待执行结束并出现系统提示符,最后logout方法断开连接。

# -*- coding:UTF-8 -*-
'''
Created on 2018年1月9日

@author: liuyazhuang
'''
import pxssh
import getpass
try:
    #创建pxssh对象s
    s = pxssh.pxssh() 
    hostname = raw_input('hostname: ')
    username = raw_input('username: ')
    #接收密码输入
    password = getpass.getpass('please input password: ') 
    #建立ssh连接
    s.login(hostname, username, password)
    #运行uptime命令
    s.sendline('uptime')
    #匹配系统提示符
    s.prompt()
    #打印出现系统提示符前的命令输出
    print s.before
    s.sendline('ls -l')
    s.prompt()
    print s.before
    s.sendline('df')
    s.prompt()
    print s.before
    #断开ssh连接
    s.logout()
    
except pxssh.ExceptionPxssh, e:
    print 'pxssh failed on login.'
    print str(e)
    

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

冰 河

可以吃鸡腿么?

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值