Python之——系統批量運維管理器pexpect
阿新 • • 發佈:2019-01-10
一、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引數可以是任意已知的系統命令,如:
當子程式需要引數時,還可以使用Python列表來代替引數項,如:child = pexpect.spawn('/usr/bin/ftp') #啟動ftp客戶端命令 child = pexpect.spawn('/usr/bin/ssh ip') #啟動ssh遠端連線命令 child = pexpect.spawn('ls -latr /tmp') #執行ls顯示/tmp目錄內容命令
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的引數進行呼叫,例如:
我們可以通過將命令的引數以Python列表的形式進行替換,從而使我們的語法變成更加清晰,下面的程式碼等價於上面的。child = pexpect.spawn('/bin/bash -c "ls -l | grep LOG > logs.txt"') child.expect(pexpect.EOF)
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)