Python使用Pexpect庫實現(xiàn)自動化與終端交互的任務
Pexpect 是一個 Python 庫,用于自動化與終端交互的任務。它提供了一種簡單的方式來編寫腳本,以便與終端程序進行交互。以下是 Pexpect 的一些常用參數(shù)和方法的更詳細說明:
常用參數(shù):
command:這是你想要啟動的命令行程序的路徑。例如,如果你想要啟動一個名為 ‘ftp’ 的程序,你可以傳遞 ‘/usr/bin/ftp’ 作為這個參數(shù)的值。
timeout:這是你愿意等待命令行程序輸出的最大時間(以秒為單位)。如果在這個時間內,你沒有從命令行程序收到任何輸出,Pexpect 將引發(fā)一個超時異常。
maxread:這是你想要從命令行程序中讀取的最大字節(jié)數(shù)。默認值是 2000,即最多讀取 2000 個字節(jié)。
searchwindowsize:這是你想要搜索的字符串或正則表達式的窗口大小。默認值是 25,這意味著 Pexpect 將只檢查最近的 25 個字符或行來尋找匹配項。
logfile:這是一個文件對象,Pexpect 將把所有標準輸出和標準錯誤輸出重定向到這個文件。如果你不提供這個參數(shù),輸出將仍然顯示在控制臺上。
常用方法:
spawn():
這是啟動一個新的命令行程序的方法。你可以傳遞一個命令行程序的路徑作為參數(shù)。例如,ftp = pexpect.spawn(‘/usr/bin/ftp’) 將啟動 FTP 客戶端。
expect():
這是等待命令行程序輸出特定字符串或正則表達式的方法。你可以傳遞一個字符串或正則表達式作為參數(shù),然后 Pexpect 將等待直到程序輸出這個字符串或正則表達式。例如,ftp.expect('ftp> ') 將等待直到 FTP 客戶端提示你輸入命令。
sendline():
這是向命令行程序發(fā)送一行命令的方法。你可以傳遞一個字符串作為參數(shù),然后 Pexpect 將把這個字符串發(fā)送給程序。例如,ftp.sendline(‘ls’) 將發(fā)送 ‘ls’ 命令到 FTP 客戶端,然后等待程序輸出結果。
close():
這是關閉與命令行程序的連接的方法。當你完成與程序的交互后,你應該調用這個方法來釋放資源。例如,ftp.close() 將關閉與 FTP 客戶端的連接。
interact():
這是啟動交互模式的方法。在交互模式下,你可以手動控制與命令行程序的交互。例如,你可以使用鍵盤輸入命令,然后使用 sendline() 方法將它們發(fā)送到程序。
Pexpect可以通過以下方式進行安裝:
pip安裝:在命令行輸入pip3 install pexpect即可。
easy_install安裝:在命令行輸入easy_install pexpect即可。
源碼安裝:下載Pexpect的源代碼包,解壓后進入目錄,然后在命令行輸入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 #安裝完成之后做一個軟連接: ln -s /usr/tcl/bin/expect /usr/expect/bin/expect #加入環(huán)境變量并測試: 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
# 啟動 FTP 子程序
ftp = pexpect.spawn('ftp')
# 期望看到 'ftp>' 提示符
ftp.expect('ftp> ')
# 發(fā)送用戶名和密碼(假設為 'user' 和 'pass')
ftp.sendline('user')
ftp.sendline('pass')
# 期望登錄成功
ftp.expect('230 Login successful')
# 發(fā)送命令 'dir' 查看目錄列表
ftp.sendline('dir')
ftp.expect('Directory listing')
# 關閉 FTP 子程序
ftp.sendline('bye')
log:
import pexpect
import time
# 創(chuàng)建日志文件并設置 Pexpect 記錄日志
log_file = open('ftp_log.txt', 'w')
ftp = pexpect.spawn('ftp', logfile=log_file)
time.sleep(2) # 讓子程序運行一段時間以便記錄日志
log_file.close() # 關閉日志文件
telnet:
import pexpect
# 啟動 Telnet 子程序
telnet = pexpect.spawn('telnet', ['hostname', 'port'])
# 期望看到 Telnet 提示符
telnet.expect('login: ')
# 發(fā)送用戶名和密碼(假設為 'user' 和 'pass')
telnet.sendline('user')
telnet.expect('Password:')
telnet.sendline('pass')
# 期望登錄成功并看到提示符(例如 '#' 或 '$')
telnet.expect('#')
# 使用 interact 方法進行交互(注意:interact 方法會阻塞程序執(zhí)行直到子程序關閉)
telnet.interact()
到此這篇關于Python使用Pexpect庫實現(xiàn)自動化與終端交互的任務的文章就介紹到這了,更多相關Python Pexpect內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
python讀取csv和txt數(shù)據(jù)轉換成向量的實例
今天小編就為大家分享一篇python讀取csv和txt數(shù)據(jù)轉換成向量的實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-02-02
詳解Python下Flask-ApScheduler快速指南
Flask是Python社區(qū)非常流行的一個Web開發(fā)框架,本文將嘗試將介紹APScheduler應用于Flask之中,非常具有實用價值,需要的朋友可以參考下2018-11-11

