Python之 系統批量運維管理器pexpect

2021-08-14 11:53:46 字數 3483 閱讀 2246

pexpect作為python的乙個普通模組,可以通過pip安裝,也可以通過原始碼安裝

1、pip安裝

pip install pexpect

easy_install pexpect

2、原始碼安裝
wget 

cd pexpect

python setup.py install

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=)

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 2023年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)

系統批量運維管理器Fabric詳解

1 fab常用的引數 fab作為fabric程式的命令列入口,提供了豐富的引數呼叫,命令格式如下 fab options arg1,arg2 val2,host foo,hosts h1 h2 2 全域性屬性設定 env物件的作用是定義fabfile的全域性設定,支援多個屬性,包括目標主機 使用者 ...

linux運維之批量公升級

經常給各辦事處客戶現場打補丁或公升級,面對十幾上百臺伺服器,人工一台臺替換肯定行不通,只能批量公升級,將過程記錄下來。批量公升級要解決的兩個主要問題就是 1.將補丁檔案 安裝包 上傳到各伺服器 2.各伺服器對收到的補丁檔案自動進行公升級。下面詳解各步驟 1.批量上傳檔案 batch.sh bin s...

運維子系統之運維節點

運維子系統是通用平台重要的基礎構件,運維節點則是運維子系統最重要,最基礎的構成部分。運維節點被部署在每台伺服器上,維護該台伺服器上所有的運維任務。運維節點功能上篇已經描述,本篇簡介運維節點實現上相關要點。1.守護功能 守護功能作為乙個7x24小時執行系統而言是必不可少的,再穩定服務也有發生異常的時候...