python pexpect模組詳解附常用指令碼

2021-06-19 03:23:45 字數 3939 閱讀 4908

wget
tar zxvf pexpect-2.4.tar.gz

cd pexpect-2.4/

python setup.py install

spawn是pexpect模組主要的類,用以實現啟動子程式,它有豐富的方法與子程式互動從而實現使用者對子程式的控制。示例

child = pexpect.spawn ('/usr/bin/ftp') #執行ftp客戶端命令

child = pexpect.spawn ('/usr/bin/ssh [email protected]') #使用ssh登入目標機器

child = pexpect.spawn ('ls -latr /tmp') #顯示 /tmp目錄內容

expect() 定義

expect(self, pattern, timeout=-1, searchwindowsize=none)

在引數中: pattern 可以是正規表示式, pexpect.eof , pexpect.timeout ,或者由這些元素組成的列表。需要注意的是,當 pattern 的型別是乙個列表時,且子程式輸出結果中不止乙個被匹配成功,則匹配返回的結果是緩衝區中最先出現的那個元素,或者是列表中最左邊的元素。使用 timeout 可以指定等待結果的超時時間 ,該時間以秒為單位。當超過預訂時間時, expect 匹配到pexpect.timeout。

如果難以估算程式執行的時間,可以使用迴圈使其多次等待直至等待執行結束:

expect() 在執行中可能會丟擲兩種型別的異常分別是 eof and timeouf,其中 eof 通常代表子程式的退出, timeout 代表在等待目標正規表示式中出現了超時。

例項

child.expect(["suc","fail",pexpect.timeout,pexpect.eof])
如果查詢suc成功返回0 如果超時返回2 如果子程式推出返回3

send 系列函式

send(self, s) 

sendline(self, s='')

sendcontrol(self, char)

這些方法用來向子程式傳送命令,模擬輸入命令的行為。 與 send() 不同的是 sendline() 會額外輸入乙個回車符 ,更加適合用來模擬對子程式進行輸入命令的操作。 當需要模擬傳送 「ctrl+c」 的行為時,還可以使用 sendcontrol() 傳送控制字元。

close

如果程式執行中間出現了錯誤,如使用者名稱密碼錯誤,超時或者 eof,遠端 server 連線不上,都會使用 c hild.close(force=true) 關掉 ftp 子程式。呼叫 close 可以用來關閉與子程式的 connection 連線,如果你不僅想關閉與子程式的連線,還想確保子程式是真的被 terminate 終止了,設定引數 force=true,其最終會呼叫 c hild.kill(signal.sigkill) 來殺掉子程式。

附錄scp命令使用指令碼

# -*- coding: utf-8 -*-

import sys

from optparse import optionparser

import traceback

import pexpect

import datetime

def scp_from(user,host,route_from,route_to,password):

cmd = "scp -r %s@%s:%s %s"%(user,host,route_from,route_to)

print cmd

scp = pexpect.spawn(cmd)

try:

i = scp.expect(['password:',pexpect.eof],timeout=60)

if i == 0:

scp.sendline(password)

j = scp.expect(['password:',pexpect.eof],timeout=60)

if j == 0:

print "password wrong for %s"%host

except:

traceback.print_exc()

scp.close()

def scp_to(route_from,user,host,route_to,password):

cmd = "scp -r %s %s@%s:%s"%(route_from,user,host,route_to)

print cmd

scp = pexpect.spawn(cmd)

try:

i = scp.expect(['password:',pexpect.eof],timeout=60)

if i == 0:

scp.sendline(password)

j = scp.expect(['password:',pexpect.eof],timeout=60)

if j == 0:

print "password wrong for %s"%host

except:

traceback.print_exc()

scp.close()

def main():

usage1 = "python scp.py from user host route_from route_to passwprd"

usage2 = "=(scp -r user@host:/route_from route_to)"

usage3 = "python scp.py to route_from user host route_ro passwprd"

usage4 = "=(scp -r route_from user@host:/route_ro)"

parser = optionparser(usage=usage1+usage2+usage3+usage4)

(options,args) = parser.parse_args()

if len(args) < 6 or len(args) > 6 or (args[0] != 'from' and args[0] != 'to'):

print usage1

print usage2

print usage3

print usage4

return

print options

print args

if args[0] == 'from':

user = args[1]

host = args[2]

route_from = args[3]

route_to = args[4]

password = args[5]

else:

user = args[2]

host = args[3]

route_from = args[1]

route_to = args[4]

password = args[5]

if 'from' in args:

scp_from(user,host,route_from,route_to,password)

elif 'to' in args:

scp_to(route_from,user,host,route_to,password)

now = datetime.datetime.now()

now_time = datetime.datetime.strftime(now,'%y年%m月%d日 %h:%m:%s ')

print now_time

if __name__ == "__main__":

main()

求助python pexpect報錯

不知道為什麼 在h3c cisco裝置使用都是正常的,在某乙個型號交換機下面就報錯,請大家幫忙找下錯誤在 import pexpect import sys import datetime import os today datetime.date.today strftime y m d path...

python pexpect 自動連線ssh

使用python pexpect 1.首先是安裝 前提是python2.5以上你已經安裝好了 tar xzvf pexpect 2.1.orig.tar.gz cd pexpect 2.1 python setup.py install 沒許可權時,記得sudo 3.編寫linkssh.py usr...

Python Pexpect庫的簡單使用

最近需要遠端操作乙個伺服器並執行該伺服器上的乙個python指令碼,查到可以使用pexpect這個庫。記錄一下。什麼是pexpect?pexpect能夠產生子應用程式,並控制他們,並能夠通過期望模式對子應用的輸出做出反應。pexpect允許你的指令碼產生子應用 控制他們像乙個人類在輸入命令一樣。pe...