1. 程式人生 > >Python之——系統批量運維管理器pexpect

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)