Python使用Pexpect庫(kù)實(shí)現(xiàn)自動(dòng)化與終端交互的任務(wù)
Pexpect 是一個(gè) Python 庫(kù),用于自動(dòng)化與終端交互的任務(wù)。它提供了一種簡(jiǎn)單的方式來(lái)編寫(xiě)腳本,以便與終端程序進(jìn)行交互。以下是 Pexpect 的一些常用參數(shù)和方法的更詳細(xì)說(shuō)明:
常用參數(shù):
command:這是你想要啟動(dòng)的命令行程序的路徑。例如,如果你想要啟動(dòng)一個(gè)名為 ‘ftp’ 的程序,你可以傳遞 ‘/usr/bin/ftp’ 作為這個(gè)參數(shù)的值。
timeout:這是你愿意等待命令行程序輸出的最大時(shí)間(以秒為單位)。如果在這個(gè)時(shí)間內(nèi),你沒(méi)有從命令行程序收到任何輸出,Pexpect 將引發(fā)一個(gè)超時(shí)異常。
maxread:這是你想要從命令行程序中讀取的最大字節(jié)數(shù)。默認(rèn)值是 2000,即最多讀取 2000 個(gè)字節(jié)。
searchwindowsize:這是你想要搜索的字符串或正則表達(dá)式的窗口大小。默認(rèn)值是 25,這意味著 Pexpect 將只檢查最近的 25 個(gè)字符或行來(lái)尋找匹配項(xiàng)。
logfile:這是一個(gè)文件對(duì)象,Pexpect 將把所有標(biāo)準(zhǔn)輸出和標(biāo)準(zhǔn)錯(cuò)誤輸出重定向到這個(gè)文件。如果你不提供這個(gè)參數(shù),輸出將仍然顯示在控制臺(tái)上。
常用方法:
spawn():
這是啟動(dòng)一個(gè)新的命令行程序的方法。你可以傳遞一個(gè)命令行程序的路徑作為參數(shù)。例如,ftp = pexpect.spawn(‘/usr/bin/ftp’) 將啟動(dòng) FTP 客戶(hù)端。
expect():
這是等待命令行程序輸出特定字符串或正則表達(dá)式的方法。你可以傳遞一個(gè)字符串或正則表達(dá)式作為參數(shù),然后 Pexpect 將等待直到程序輸出這個(gè)字符串或正則表達(dá)式。例如,ftp.expect('ftp> ') 將等待直到 FTP 客戶(hù)端提示你輸入命令。
sendline():
這是向命令行程序發(fā)送一行命令的方法。你可以傳遞一個(gè)字符串作為參數(shù),然后 Pexpect 將把這個(gè)字符串發(fā)送給程序。例如,ftp.sendline(‘ls’) 將發(fā)送 ‘ls’ 命令到 FTP 客戶(hù)端,然后等待程序輸出結(jié)果。
close():
這是關(guān)閉與命令行程序的連接的方法。當(dāng)你完成與程序的交互后,你應(yīng)該調(diào)用這個(gè)方法來(lái)釋放資源。例如,ftp.close() 將關(guān)閉與 FTP 客戶(hù)端的連接。
interact():
這是啟動(dòng)交互模式的方法。在交互模式下,你可以手動(dòng)控制與命令行程序的交互。例如,你可以使用鍵盤(pán)輸入命令,然后使用 sendline() 方法將它們發(fā)送到程序。
Pexpect可以通過(guò)以下方式進(jìn)行安裝:
pip安裝:在命令行輸入pip3 install pexpect即可。
easy_install安裝:在命令行輸入easy_install pexpect即可。
源碼安裝:下載Pexpect的源代碼包,解壓后進(jìn)入目錄,然后在命令行輸入python setup.py install即可。
#下載tcl源碼包: wget http://prdownloads.sourceforge.net/tcl/tcl8.4.20-src.tar.gz。 #解壓并編譯安裝tcl: tar zxvf tcl8.4.20-src.tar.gz,cd tcl8.4.20/unix/,./configure --prefix=/usr/tcl --enable-shared,make,make install。 #下載expect源碼包:wget http://sourceforge.net/projects/expect/files/Expect/5.45/expect5.45.tar.gz。 #解壓并編譯安裝expect: tar zxvf expect5.45.tar.gz, cd expect5.45, ./configure --prefix=/usr/expect --with-tcl=/usr/tcl/lib --with-tclinclude=../tcl8.4.20/generic/, make, make install #安裝完成之后做一個(gè)軟連接: ln -s /usr/tcl/bin/expect /usr/expect/bin/expect #加入環(huán)境變量并測(cè)試: echo 'export PATH=$PATH:/usr/expect/bin' >> /etc/profile
示例:
#!/usr/bin/env python import pexpect devices = {'iosv-1': {'prompt': 'lax-edg-r1#', 'ip': '192.168.2.51'}, 'iosv-2': {'prompt': 'lax-edg-r2#', 'ip': '192.168.2.52'}} username = 'cisco' password = 'cisco' for device in devices.keys(): device_prompt = devices[device]['prompt'] child = pexpect.spawn('telnet ' + devices[device]['ip']) child.expect('Username:') child.sendline(username) child.expect('Password:') child.sendline(password) child.expect(device_prompt) child.sendline('show version | i V') child.expect(device_prompt) print(child.before) child.sendline('exit')
ssh:
from pexpect import pxssh >>> child = pxssh.pxssh() >>> child.login('192.168.2.51', 'cisco', 'cisco', auto_prompt_reset=False) True >>> child.sendline('show version | i V') 19 >>> child.expect('lax-edg-r1#') 0 >>> child.before b'show version | i V\r\nCisco IOS Software, IOSv Software (VIOSADVENTERPRISEK9-M), Version 15.8(3)M2, RELEASE SOFTWARE (fc2)\r\nProcessor board ID 98U40DKV403INHIULHYHB\r\n' >>> child.logout()
ftp:
import pexpect # 啟動(dòng) FTP 子程序 ftp = pexpect.spawn('ftp') # 期望看到 'ftp>' 提示符 ftp.expect('ftp> ') # 發(fā)送用戶(hù)名和密碼(假設(shè)為 'user' 和 'pass') ftp.sendline('user') ftp.sendline('pass') # 期望登錄成功 ftp.expect('230 Login successful') # 發(fā)送命令 'dir' 查看目錄列表 ftp.sendline('dir') ftp.expect('Directory listing') # 關(guān)閉 FTP 子程序 ftp.sendline('bye')
log:
import pexpect import time # 創(chuàng)建日志文件并設(shè)置 Pexpect 記錄日志 log_file = open('ftp_log.txt', 'w') ftp = pexpect.spawn('ftp', logfile=log_file) time.sleep(2) # 讓子程序運(yùn)行一段時(shí)間以便記錄日志 log_file.close() # 關(guān)閉日志文件
telnet:
import pexpect # 啟動(dòng) Telnet 子程序 telnet = pexpect.spawn('telnet', ['hostname', 'port']) # 期望看到 Telnet 提示符 telnet.expect('login: ') # 發(fā)送用戶(hù)名和密碼(假設(shè)為 'user' 和 'pass') telnet.sendline('user') telnet.expect('Password:') telnet.sendline('pass') # 期望登錄成功并看到提示符(例如 '#' 或 '$') telnet.expect('#') # 使用 interact 方法進(jìn)行交互(注意:interact 方法會(huì)阻塞程序執(zhí)行直到子程序關(guān)閉) telnet.interact()
到此這篇關(guān)于Python使用Pexpect庫(kù)實(shí)現(xiàn)自動(dòng)化與終端交互的任務(wù)的文章就介紹到這了,更多相關(guān)Python Pexpect內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
python?pip?install總是報(bào)錯(cuò)情況分析及解決辦法
這篇文章主要給大家介紹了關(guān)于python?pip?install總是報(bào)錯(cuò)情況分析及解決辦法,安裝包時(shí)經(jīng)常遇到報(bào)錯(cuò),這里提供兩種方式解決,文中通過(guò)圖文介紹的非常詳細(xì),需要的朋友可以參考下2023-10-10ubuntu環(huán)境下python虛擬環(huán)境的安裝過(guò)程
這篇文章主要介紹了ubuntu環(huán)境下python虛擬環(huán)境的安裝搭建過(guò)程 ,需要的朋友可以參考下2018-01-01python爬蟲(chóng) 基于requests模塊的get請(qǐng)求實(shí)現(xiàn)詳解
這篇文章主要介紹了python爬蟲(chóng) 基于requests模塊的get請(qǐng)求實(shí)現(xiàn)詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-08-08python實(shí)現(xiàn)楊輝三角的幾種方法代碼實(shí)例
這篇文章主要介紹了python實(shí)現(xiàn)楊輝三角的幾種方法代碼實(shí)例,文中圖文代碼講解的很清晰,有不太懂的同學(xué)可以學(xué)習(xí)下2021-03-03python使用socket 先讀取長(zhǎng)度,在讀取報(bào)文內(nèi)容示例
這篇文章主要介紹了python使用socket 先讀取長(zhǎng)度,在讀取報(bào)文內(nèi)容,涉及Python socket通信報(bào)文操作相關(guān)使用技巧,需要的朋友可以參考下2019-09-09Python實(shí)現(xiàn)一個(gè)數(shù)組除以一個(gè)數(shù)的例子
今天小編就為大家分享一篇Python實(shí)現(xiàn)一個(gè)數(shù)組除以一個(gè)數(shù)的例子,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-07-07