當前位置:首頁 » 編程語言 » pythonexpect

pythonexpect

發布時間: 2023-09-03 07:35:59

1. pexpect 跨平台(WIN、LINUX)簡明教程

詳細的內容可以參考下面的參考文檔,下面的內容主要是為網路設備運維人員使用的pexpect 跨平台簡明教程。

Expect 程序主要用於人機對話的模擬,就是那種系統提問,人來回答 yes/no ,或者賬號登錄輸入用戶名和密碼等等的情況。
pexpect是 Don Libes 的 Expect 語言的一個 python 實現,是一個用來啟動子程序,並使用正則表達式對程序輸出做出特定響應,以此實現與其自動交互的 Python 模塊。它可以用來實現與ssh, ftp, telnet等程序的自動交互。

send命令後執行結果內容保存在buffer中,這時child.expect('keyword')後,child.before即為「keyword」之前的字元串,child.after即為匹配的」keyword」字元串。
command的執行結果都保存在一個buffer中,每次執行expect時都從buffer中開始檢查匹配的pattern,如果找到了匹配的pattern,則所有在匹配處之前的內容都從buffer中清除。
(這邊沒有看明白也沒有關系,可以看後面的實踐篇例子)

通常維護人員有的偏向於用WIN系統,有的偏向於LINUX系統。所以前期團隊希望形成一個統一框架的時候就出現了一個難題。框架如何適用於不同的系統。
LInux系統pexpect包,win系統前期嘗試使用winpexpect,但是程序改動很大,並沒有調試成功。
如何在WIN系統使用python的pexpect包很難找到相關資料,某乎上都是類似的疑問沒有解答。
團隊成員增加後,終於有了新的思路 , 團結就是力量 。

通過這個模塊進行不同系統的適配。
將plink.exe裝在python的文件夾在python的安裝目錄下,win系統可以同樣使用pexpect模塊

參考信息1:Pexpect 官方文檔 New in version 4.0: Windows support。Pexpect can be used on Windows to wait for a pattern to be proced by a child process, using [ pexpect.popen_spawn.PopenSpawn ]
參考信息2:PuTTY是一個Telnet、SSH、rlogin、純TCP以及串列介面連接軟體。plink是可以獨立使用的exe實現形式,可以讓我們直接在命令行制定好命令,然後執行,完成後自動關閉session。ssh是一個安全通道協議。plink是這個通道協議的一個實現 [圖片上傳中...(-572001-1587612890428-0)]

從官方文檔來看,
sendline() 和 send() 唯一的區別就是在發送的字元串後面加上了回車換行符,這也使它們用在了不同的地方:
只需要發送字元就可以的話用send()
如果發送字元後還要回車的話,就用 sendline()
但是在調測過程中,WIN系統下命令輸入後,child.before始終得不到預想中的結果。
經過逐步排查,發現在WIN系統下只能使用send() ,如果使用sendline() ,第一次交互沒有問題,後續交互就開始問題。

WIN系統下child.before輸出為b'byte型,做判斷時要轉為str型。具體可以參考最後面一篇講編碼類型的文章,講的很詳細。

例子1

send Username後,child.before一直到'Tac_Userna',child.after為『me:』,child.buffer為空。

expect關鍵字assword:後,child.before回顯一直到keyword之前,child.after為keyword,child.buffer為空。

例子2

下發command命令,child.before維持原來的不變,expect到keyword以後,child.before變為下發command命令後的設備回顯。

參考文檔

官方文檔

探索Pexpect

Pexpect示例及使用Tips

Python Pexpect模塊講解

Pexpect模塊使用說明

windows下使用plink實現全自動登陸ssh

Python3_字元編碼

2. 怎樣用python實現scp

scp 功能很強大,但需要人工輸入 password, 當然可以通過把 公鑰保存在遠程主機的 ~/.ssh 目錄中,而後就不用輸入password,但這需要配置.

用 sshpass 可能在命令輸入 password, 但 需要用 「sudo apt-get install sshpass」 安裝
如果不想用上面兩種方法,可以用 expect 編寫腳本可以幫助我們自動交互

雖然 Python 也提供 pexpect 模塊,但既然 expect 很簡單,為何不直接用 os.system() 去執行呢?

下面是我編寫的類,實現了遠程復制

[html] view plain
class RemoteShell:

def __init__(self, host, user, pwd):
self.host = host
self.user = user
self.pwd = pwd

def put(self, local_path, remote_path):
scp_put = '''
spawn scp %s %s@%s:%s
expect "(yes/no)?" {
send "yes\r"
expect "password:"
send "%s\r"
} "password:" {send "%s\r"}
expect eof
exit'''
os.system("echo '%s' > scp_put.cmd" % (scp_put % (os.path.expanser(local_path), self.user, self.host, remote_path, self.pwd, self.pwd)))
os.system('expect scp_put.cmd')
os.system('rm scp_put.cmd')

但發現每次文件都沒有復制完,我想看expect 究竟做了什麼事情,還好 expect 提供 -d 參數給出更多的信息。
最後發現是被復制文件太大,expect 超時退出了

在腳本前加入 「set timeout -1" 就OK了

[html] view plain
scp_put = '''
set timeout -1
spawn scp %s %s@%s:%s
expect "(yes/no)?" {
send "yes\r"
expect "password:"
send "%s\r"
} "password:" {send "%s\r"}
expect eof
exit'''

熱點內容
瑞影無損圖片壓縮大師 發布:2025-03-13 13:27:33 瀏覽:450
應用怎樣加密 發布:2025-03-13 13:18:10 瀏覽:672
李弘毅訪問 發布:2025-03-13 13:17:30 瀏覽:654
伺服器搭建直播平台源碼 發布:2025-03-13 12:54:38 瀏覽:813
c語言的題 發布:2025-03-13 12:45:01 瀏覽:609
小學試演算法 發布:2025-03-13 12:39:06 瀏覽:998
更改手機伺服器節點有什麼用 發布:2025-03-13 12:39:04 瀏覽:307
python基礎視頻教程下載 發布:2025-03-13 12:37:38 瀏覽:803
筆記本怎麼配置揚聲器 發布:2025-03-13 12:32:03 瀏覽:542
台灣虛擬伺服器雲主機 發布:2025-03-13 12:18:07 瀏覽:355