python 終端模擬模組 pexpect

2021-09-25 08:21:05 字數 3203 閱讀 5519

簡單介紹

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

安裝均可以使用pip進行

注意:windows和linux安裝模組是不同的。如下:

在linux下安裝:pip3 install pexpect

在windows下安裝: pip3.exe install winpexpect

在windows系統裡建立子程式是:

import winpexpect

child = winpexpect.winspawn('command')

另:run(), pxssh()均不可使用

在linux系統裡建立子程式是:

import pexpect

child = pexpect.spawn('cmd')

模組內主要的類/函式介紹

spawn / winspawn 類

作用:可以實現更複雜的互動,通過生成子程式進行sendline(傳送命令)與expect(返回操作符)進行互動。

class spawn

def __init__(self, command, args=, timeout=30, maxread=2000,

searchwindowsize=none, logfile=none, cwd=none, env=none,

username=none, domain=none, password=none)

個別引數解釋:

timeout:互動等待的超時值,預設30秒

maxread:設定read buffer大小,

searchwindowsize:從輸入緩衝區中進行模式匹配的位置,預設從開始匹配。

logfile:指定日誌的記錄位置

注意:pexpect不支援管道,重定向或萬用字元,如果需要使用,需要重新開啟乙個shell

簡單用法:

# 第一步建立子程式,輸入執行的操作命令,我這裡是以telnet遠端終端為例

child = pexpect.spawn('telnet ipaddress')

# 第二步從子命令返回的結果中進行匹配,語法:expect(pattern, timeout=-1),

pattern引數說明:可以為字串,正規表示式,eof,timeout,或者是以上型別的列表,若只提供字串,匹配成功後返回0,若提供列表,匹配成功後返回列表的索引序號。未匹配成功,則會引發異常

timeout:為-1 使用預設的超時期限,設定為none,將阻塞至返回資訊

child.expect('password:')

# 第三步匹配成功後,傳送互動資訊,這裡傳送密碼

child.sendline(mypassword)

獲取命令執行結果主要由3個基本屬性。

child.before:輸出匹配點之前的命令執行結果

child.after:輸出匹配成功後的匹配點內容,如識別符號:hostname#>

child.match:儲存已匹配的匹配點物件,可以使用string,列印命令的執行結果。

pxssh類

是pexpect的派生類,用於建立ssh連線,比pexpect直接使用ssh時簡單一些,內建3個方法:

login() 建立到目標機器的ssh連線;

logout() 釋放該連線;

prompt() 等待提示符,通常用於等待命令執行結束。

pexpect.eof 異常錯誤

獲取pexpect錯誤資訊,可能會有兩種 eof 異常被丟擲,但是他們除了顯示的資訊不同,其實本質上是相同的。為了實用的目的,不需要區分它們,他們只是給了些關於你的 python 程式到底執行在哪個平台上的額外資訊,這兩個顯示資訊是:

end of file (eof) in read(). exception style platform.

end of file (eof) in read(). empty string style platform.

有些 unix 平台,當你讀取乙個處於 eof 狀態的檔案描述符時,會丟擲異常,其他 unix 平台,卻只會靜靜地返回乙個空字串來表明該檔案已經達到了狀態。

pexpect.timeout異常錯誤

如果子程式沒有在指定的時間內生成任何 output,那麼 expect() 和 read() 都會產生 timeout 異常。超時預設是 30s,可以在 expect() 和 spawn 建構函式初始化時指定為其它時間

child.expect('password:', timeout=120) # 等待 120s

如果你想讓 expect() 和 read() 忽略超時限制,即無限期阻塞住直到有 output 產生,設定 timeout 引數為 none。

**如:

child = pexpect.spawn( "telnet 網域名稱" )

child.expect( "login", timeout=none )

以上兩個錯誤可以使用try語句來處理報錯

try:

child=pexpect.spawn('telnet ip',timeout=5)

child.logfile = log

child.logfile_send=sys.stdout 

child.expect("new password:")

child.sendline(mypassword)

child.expect("retype new password:")

child.sendline(mypassword)

child.expect("passwd: all authentication tokens updated successfully.")

except pexpect.eof:

pass

except pexpect.timeout:

pass

例項:自動登陸ftp

例項:自動登陸交換機執行一條命令後退出,最好在linux系統下進行測試,在windows下使用winpexpect不好用

python終端模擬工具pexpect

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

python使用requests模組模擬登陸知乎

text input 請輸入驗證碼 def zhihulogin 構建乙個session物件,可以儲存cookie 相當於urllib中用的cookiejar sess requests.session 請求報頭 首先獲取登陸頁面,找到需要post的資料,同時記錄當前頁的cookie值 html s...

在終端模擬下雪

及解釋 charles的皮卡丘 試試在終端模擬下雪的效果唄?比較簡單,其實我寫這篇部落格的目的是講錄製gif工具 screentogif 它是一款免費開源 體積極小的gif錄製工具。其提供的視窗對齊功能是我等眾多強迫症患者的福音啊。也支援一定程度的編輯。匯出時建議選擇 2.0 編碼器,畫質和大小都比...