pexpect 跨平臺(WIN待笑、LINUX)簡明教程

//by Chaos
謝絕轉(zhuǎn)載

詳細(xì)的內(nèi)容可以參考下面的參考文檔搀绣,下面的內(nèi)容主要是為網(wǎng)絡(luò)設(shè)備運(yùn)維人員使用的pexpect 跨平臺簡明教程。

基本概念:

pexpect是什么

Expect 程序主要用于人機(jī)對話的模擬蔗包,就是那種系統(tǒng)提問,人來回答 yes/no 昆码,或者賬號登錄輸入用戶名和密碼等等的情況气忠。
pexpect是 Don Libes 的 Expect 語言的一個 Python 實(shí)現(xiàn),是一個用來啟動子程序,并使用正則表達(dá)式對程序輸出做出特定響應(yīng)赋咽,以此實(shí)現(xiàn)與其自動交互的 Python 模塊旧噪。它可以用來實(shí)現(xiàn)與ssh, ftp, telnet等程序的自動交互。

pexpect主要模塊

  • pexpect.spawn 創(chuàng)建一個子程序child脓匿,執(zhí)行一個程序
  • child.sendline(或send)是在子程序中輸入command淘钟,用 send 方法來發(fā)送字符串給這個程序
  • child.expect用 expect 來等待指定的關(guān)鍵字,這個關(guān)鍵字是被執(zhí)行的程序打印到標(biāo)準(zhǔn)輸出上面的

child.buffer child.before child.after

send命令后執(zhí)行結(jié)果內(nèi)容保存在buffer中陪毡,這時child.expect('keyword')后米母,child.before即為“keyword”之前的字符串,child.after即為匹配的”keyword”字符串毡琉。
command的執(zhí)行結(jié)果都保存在一個buffer中铁瞒,每次執(zhí)行expect時都從buffer中開始檢查匹配的pattern,如果找到了匹配的pattern桅滋,則所有在匹配處之前的內(nèi)容都從buffer中清除慧耍。
(這邊沒有看明白也沒有關(guān)系身辨,可以看后面的實(shí)踐篇例子)

一些需要強(qiáng)調(diào)的細(xì)節(jié)

跨平臺使用

通常維護(hù)人員有的偏向于用WIN系統(tǒng),有的偏向于LINUX系統(tǒng)芍碧。所以前期團(tuán)隊(duì)希望形成一個統(tǒng)一框架的時候就出現(xiàn)了一個難題煌珊。框架如何適用于不同的系統(tǒng)泌豆。
LInux系統(tǒng)pexpect包定庵,win系統(tǒng)前期嘗試使用winpexpect,但是程序改動很大踪危,并沒有調(diào)試成功蔬浙。
如何在WIN系統(tǒng)使用python的pexpect包很難找到相關(guān)資料,某乎上都是類似的疑問沒有解答贞远。
團(tuán)隊(duì)成員增加后敛滋,終于有了新的思路 ,團(tuán)結(jié)就是力量兴革。

        #linux系統(tǒng)采用以下判斷
        if sys.platform.startswith('linux'):
            print("sys.platform=linux.connect()")
            tiaoban = 'ssh -o KexAlgorithms=diffie-hellman-group14-sha1 -o StrictHostKeyChecking=no -v'+TbUser+'@跳板機(jī)ip -p 跳板機(jī)端口'
            child = pexpect.spawn(tiaoban)
        # win系統(tǒng)采用以下判斷
        elif sys.platform.startswith('win'):
            print("sys.platform=windows.connect()")
            tiaoban = 'plink.exe -ssh -v '+TbUser+'@跳板機(jī)ip -p 跳板機(jī)端口
            child = pexpect.popen_spawn.PopenSpawn(tiaoban)
            index = child.expect(["y/n", "assword:"])

通過這個模塊進(jìn)行不同系統(tǒng)的適配绎晃。
將plink.exe裝在python的文件夾在python的安裝目錄下,win系統(tǒng)可以同樣使用pexpect模塊

參考信息1:Pexpect 官方文檔 New in version 4.0: Windows support杂曲。Pexpect can be used on Windows to wait for a pattern to be produced by a child process, using [pexpect.popen_spawn.PopenSpawn]
參考信息2:PuTTY是一個Telnet庶艾、SSH、rlogin擎勘、純TCP以及串行接口連接軟件咱揍。plink是可以獨(dú)立使用的exe實(shí)現(xiàn)形式,可以讓我們直接在命令行制定好命令棚饵,然后執(zhí)行煤裙,完成后自動關(guān)閉session。ssh是一個安全通道協(xié)議噪漾。plink是這個通道協(xié)議的一個實(shí)現(xiàn) [圖片上傳中...(image.png-572001-1587612890428-0)]

sendline() 和 send()

從官方文檔來看硼砰,
sendline() 和 send() 唯一的區(qū)別就是在發(fā)送的字符串后面加上了回車換行符,這也使它們用在了不同的地方:
只需要發(fā)送字符就可以的話用send()
如果發(fā)送字符后還要回車的話欣硼,就用 sendline()
但是在調(diào)測過程中题翰,WIN系統(tǒng)下命令輸入后,child.before始終得不到預(yù)想中的結(jié)果诈胜。
經(jīng)過逐步排查豹障,發(fā)現(xiàn)在WIN系統(tǒng)下只能使用send() ,如果使用sendline() 焦匈,第一次交互沒有問題血公,后續(xù)交互就開始問題。

WIN系統(tǒng)下child.before輸出類型

WIN系統(tǒng)下child.before輸出為b'byte型缓熟,做判斷時要轉(zhuǎn)為str型累魔。具體可以參考最后面一篇講編碼類型的文章岩饼,講的很詳細(xì)。

child.before.decode(encoding="ascii")

child.before child.after實(shí)踐

例子1

        child.sendline('%s' % dev)
        index=child.expect(['me:','in:'])
        child.send(MANUser + '\r')
        child.expect('assword:')
        child.send(MANPass + '\r')
        child.expect(['>', '#'])
        print("login succ!")

send Username后,child.before一直到'Tac_Userna',child.after為‘me:’,child.buffer為空薛夜。


send Username后.png

expect關(guān)鍵字assword:后,child.before回顯一直到keyword之前版述,child.after為keyword梯澜,child.buffer為空。


expect關(guān)鍵字assword:后.png

expect關(guān)鍵字#后渴析,child.before回顯一直到keyword之前晚伙,child.after為keyword,child.buffer為空俭茧。
expect關(guān)鍵字#后.png

例子2

        child.send(Command+ '\r')
        child.expect('>')

下發(fā)command命令咆疗,child.before維持原來的不變,expect到keyword以后母债,child.before變?yōu)橄掳l(fā)command命令后的設(shè)備回顯午磁。


Command下發(fā).png
expect關(guān)鍵字后.png

參考文檔

官方文檔

探索Pexpect

Pexpect示例及使用Tips

Python Pexpect模塊講解

Pexpect模塊使用說明

windows下使用plink實(shí)現(xiàn)全自動登陸ssh

Python3_字符編碼

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
禁止轉(zhuǎn)載,如需轉(zhuǎn)載請通過簡信或評論聯(lián)系作者毡们。
  • 序言:七十年代末迅皇,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子衙熔,更是在濱河造成了極大的恐慌登颓,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,907評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件红氯,死亡現(xiàn)場離奇詭異框咙,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)痢甘,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,987評論 3 395
  • 文/潘曉璐 我一進(jìn)店門喇嘱,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人塞栅,你說我怎么就攤上這事婉称。” “怎么了构蹬?”我有些...
    開封第一講書人閱讀 164,298評論 0 354
  • 文/不壞的土叔 我叫張陵王暗,是天一觀的道長。 經(jīng)常有香客問我庄敛,道長俗壹,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,586評論 1 293
  • 正文 為了忘掉前任藻烤,我火速辦了婚禮绷雏,結(jié)果婚禮上头滔,老公的妹妹穿的比我還像新娘。我一直安慰自己涎显,他們只是感情好坤检,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,633評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著期吓,像睡著了一般早歇。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上讨勤,一...
    開封第一講書人閱讀 51,488評論 1 302
  • 那天箭跳,我揣著相機(jī)與錄音,去河邊找鬼潭千。 笑死谱姓,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的刨晴。 我是一名探鬼主播屉来,決...
    沈念sama閱讀 40,275評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼狈癞!你這毒婦竟也來了奶躯?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,176評論 0 276
  • 序言:老撾萬榮一對情侶失蹤亿驾,失蹤者是張志新(化名)和其女友劉穎嘹黔,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體莫瞬,經(jīng)...
    沈念sama閱讀 45,619評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡儡蔓,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,819評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了疼邀。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片喂江。...
    茶點(diǎn)故事閱讀 39,932評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖旁振,靈堂內(nèi)的尸體忽然破棺而出获询,到底是詐尸還是另有隱情,我是刑警寧澤拐袜,帶...
    沈念sama閱讀 35,655評論 5 346
  • 正文 年R本政府宣布吉嚣,位于F島的核電站,受9級特大地震影響蹬铺,放射性物質(zhì)發(fā)生泄漏尝哆。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,265評論 3 329
  • 文/蒙蒙 一甜攀、第九天 我趴在偏房一處隱蔽的房頂上張望秋泄。 院中可真熱鬧琐馆,春花似錦、人聲如沸恒序。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,871評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽歧胁。三九已至滋饲,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間与帆,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,994評論 1 269
  • 我被黑心中介騙來泰國打工墨榄, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留玄糟,地道東北人。 一個月前我還...
    沈念sama閱讀 48,095評論 3 370
  • 正文 我出身青樓袄秩,卻偏偏與公主長得像阵翎,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子之剧,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,884評論 2 354