python之pexpect實現自動互動的例子

2022-10-06 04:27:07 字數 2734 閱讀 1034

pewww.cppcns.comxpect 是 expect 語言的乙個 python 實現,是乙個用來啟動子程式,並使用正規表示式對程式輸出做出特定響應,以此實現與其自動互動的 python 模組。 pexpect 的使用範圍很廣,可以用來實現與 ssh、ftp 、telnet 等程式的自動互動;可以用來自動複製軟體安裝包並在不同機器自動安裝;還可以用來實現軟體測試中與命令列互動的自動化。

整體來說大致的流程包括:

執行程式

程式要求人的判斷和輸入

expect 通過關鍵字匹配

根據關鍵字向程式傳送符合的字元

基本使用流程

pexpect 的使用說來說去,就是圍繞3個關鍵命令做操作:

首先用 spawn 來執行乙個程式

然後用 expect 來等待指定的關鍵字,這個關鍵字是被執行的程式列印到標準輸出上面的

最後當發現這個關鍵字以後,根據關鍵字用 send 方法來傳送字串給這個程式

第一步只需要做一次,但在程式中會不停的迴圈第

二、三步來一步一步的完成整個工作。掌握這個概念之後 pexpect 的使用就很容易了。當然 pexpect 不會只有這 3 個方法,實際上還有很多外圍的其他方法,

spawn() - 執行程式

spawn() 方法用來執行乙個程式,它返回這個程式的操作控制代碼,以後可以通過操作這個控制代碼來對這個程式進行操作,比如:

process = pexpxkazrunect.spawn('ftp sw-tftp')

上面 spawn() 中的字串就是要執行的程式,這裡我們開啟乙個到 sw-tftp 伺服器的 ftp 連線。 spawn() 中的第乙個元素就是要執行的命令,除此之外還可以指定一些其他引數,比如: pexpect.spawn('ftp sw-tftp', timeout=60) 就指定了超時時間,這些具體的會在後面講解。

process 就是 spawn() 的程式操作控制代碼了,之後對這個程式的所有操作都是基於這個控制代碼的,所以它可以說是最重要的部分。

注意: spawn() ,或者說 pexpectwww.cppcns.com 並不會轉譯任何特殊字元 比如 | * 字元在linux的shell中有特殊含義,但是在 pexpect 中不會轉譯它們,如果在 linux 系統中想使用這些符號的正確含義就必須加上 shell 來執行,這是很容易犯的乙個錯誤。

正確的方式:

process = pexpect.spawn('/bin/bash –c "ls –l | grep log > log_list.txt"')

expect() - 關鍵字匹配

當 spawn() 啟動了乙個程式並返回程式控制控制代碼後,就可以用 expect() 方法來等待指定的關鍵字了。它最後會返回 0 表示匹配到了所需的關鍵字,如果後面的匹配關鍵字是乙個列表的話,就會返回乙個數字表示匹配到了程式設計客棧列表中第幾個關鍵字,從 0 開始計算。

send() - 傳送關鍵字

send() 作為3個關鍵操作之一,用來向程式傳送指定的字串,它的使用沒什麼特殊的地方,比如:

process.expect("ftp>")

process.send("by\n")

這個方法會返回傳送字元的數量。

sendline() - 傳送帶回車符的字串

sendline() 和 send() 唯一的區別就是在傳送的字串後面加上了回車換行符,這也使它們用在了不同的地方:

只需要傳送字元就可以的話用send()

如果傳送字元後還要回車的話,就用 sendline()

它也會返回傳送的字元數量

sendcontrol() - 傳送控制訊號

sendcontrol() 向子程式傳送控制字元,比如 ctrl+c 或者 ctrl+d 之類的,比如你要向子程式傳送 ctrl+g,那麼就這樣寫:

process.sendcontrol('g')

簡單例項:

command = 'ssh '+username+'@'+host

child = pexpect.spawn(command)

ret = child.expect([pexpect.timeout,'are you sure you want to continue connecting','[p|p]assword']+prompt)

if ret == 0:

print('[-] error connecting')

return

if ret == 1:

child.sendline('yes')

ret = child.expect([pexpect.timeout,'[p|p]assword'])

if ret == 0:

print('[-] error connecting')

return

if ret == 1:

send_command(password)

return

if ret == 2:

send_command(password)

return

return child

注:針對ssh遠端登入,pexpect又派生出了pxssh類,在ssh會話操作上再做一層封裝

其常用方法是:

login() #建立ssh連線

logout() #斷開www.cppcns.comssh連線

prompt() #等待系統提示符,用於等待命令執行結束

詳情請戳:

本文標題: python之pexpect實現自動互動的例子

本文位址:

python終端模擬工具pexpect

原文 pexpect是乙個純python模組。可以用來和ssh ftp passwd telnet 等命令列程式進行自動互動。實現與命令列互動的自動化.它提供了兩個主要介面 run 函式和spawn類.run 函式 run功能相對簡單,只能實現簡單互動 run command,timeout 1,w...

python 終端模擬模組 pexpect

簡單介紹 pexpect是 don libes 的 expect 語言的乙個 python 實現,是乙個用來啟動子程式,並使用正規表示式對程式輸出做出特定響應,以此實現與其自動互動的 python 模組。它可以用來實現與ssh,ftp,telnet等程式的自動互動,參考官方文件 安裝均可以使用pip...

Python的Pexpect的簡單使用

pexpect 是乙個用來啟動子程式並對其進行自動控制的純 python 模組。pexpect 可以用來和像 ssh ftp passwd telnet 等命令列程式進行自動互動。本文主要是針對ssh遠端登入,然後執行簡單的新建資料夾與拷貝任務 pexpect 的安裝 解壓後在目錄下執行 pytho...