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小時執行系統而言是必不可少的,再穩定服務也有發生異常的時候...