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...