棄坑pexpect,入坑paramiko

2022-05-07 04:48:08 字數 2461 閱讀 6646

上文書說到,ssh庫pexpect的使用,簡直就是個「月亮公主」——滿眼全是坑。勉強把程式寫好了,跑起來的時候發現了乙個新坑,讓我不可抗拒的把它棄掉了——經常莫名其妙的連不上伺服器!開執行緒連線14臺伺服器,總有1到3臺連不上,還查不到原因。這還了得!一怒之下把寫好的pexpect封裝庫刪掉了,用paramiko重新寫起。其實這個庫也是有一些坑的,這個放在後面說。先介紹一下這個庫的用法。

安裝方法:沒有什麼新鮮的

pip install paramiko
使用方法:

import paramiko
之後,首先可以先建立乙個全域性的log(非必需)

paramiko.util.log_to_file('

paramiko.log

')

建立乙個例項

s = paramiko.sshclient()
設定乙個balabala(好吧我解釋不清這是什麼,金鑰之類的東西)

s.set_missing_host_key_policy(paramiko.autoaddpolicy())
然後連線

s.connect(hostname=hostname, username=username, password=password)
注意連線方法並沒有返回值。

接下來傳送一條命令

stdin, stdout, stderr = s.exec_command('

ls -l

')

paramiko所使用的shell是bash,即使在ubuntu裡面也沒有ll這個命令,只能用ls -l。

然後這裡就有趣了。這裡返回了三個流:stdin(標準輸入)、stdout(標準輸出)和strerr(標準錯誤),流是不可以直接讀的,得像開啟乙個檔案那樣讀取,用read()或readlines()。並且,這兩個函式都是一次性的,也就是說,read()一次,再次read()時候結果為none,因此,需要有快取來接住這個流:

sin, sout, serr = stdin.readlines(), stdout.readlines(), stderr.readlines()
read和readline的區別跟讀檔案一樣,read是把所有值讀進乙個字串,自己處理;readlines是得到乙個列表,按行分隔,可直接for i in out.readlines()也可以自己處理列表內容。

一般的情況,傳送命令的返回結果都在out中,有這麼幾種特殊情況:

1、執行錯誤。這時候out是乙個空列表,而錯誤寫在了err中。

2、執行正確,但是本來命令就沒有什麼返回值。這時候out和err都為空。

3、執行正確,但是由於某些特殊坑命令,返回值是在err中給出,out為空。

初次發現這個問題的時候我整個人是懵逼的,大概是這麼個表情:

臥槽這特麼要怎麼判斷執行結果?後來想了些辦法,迂迴來看了。比如wget就是這樣。解決方案是在命令結束後再傳送乙個ls命令,檢視一下現在檔案是否存在。

4、sudo命令。這特麼就是個萬年大坑,不管是pexpect還是paramiko,我都栽在sudo上面好久。血淚史我就不說了,直接說解決方法吧:

首先,sudo後面要加乙個-s選項,表示從標準輸入接收密碼。標準輸入?咋麼聽起來那麼耳熟?沒錯,就是stdin,傳送完命令之後要再發個密碼;然後,命令的最後要加上』\n』作為命令的結束,如果沒有加,那麼恭喜你,伺服器以為你沒有結束命令,還在等待,而你不知道伺服器的狀態,在等待它給你反饋。於是

「我的心,在等待,永遠在等待哎哎~~」

「你知不知道,你知不知道,我等到花兒也謝了嗷嗷~~」

「等下乙個天亮,去上次牽手賞花那裡散步好嗎~」

。。。。。。

咳咳,回來。總的來說sudo就是這樣的:

stdin, stdout, stderr = s.exec_command(『sudo -s %s\n』 %cmd)

stdin.write(『%s\n』 %password)

stdin.flush()

out = stdout.readlines()

這樣就可以了。

最後的最後,別忘了退出

s.close()
我使用的就是這麼多了。其他的有send和recv函式,可以跟pexpect一樣傳送命令,接收命令;有rsa等加密方法;還有很多方便的函式。平胸而論,不對,平心而論,這個庫應該是蠻不錯的,可以做乙個互動式的ssh shell,而且據說windows下也可以用,比pexpect不知道高到**去了。只是我時間太倉促,晚上加班幾個小時內學乙個新庫,又把200多行**完全推倒重寫,任誰都會有點怨言是吧。以後如果需要的話(學乖了,不說有時間的話)還可以繼續深入研究一下。

這次就先到這裡了。

棄 填坑計畫 1 (2016 03 06)

演算法學習 1 tarjan演算法 已完成 2016.04.03 2 費用流 已完成 2016.04.07 3 字尾自動機 已完成 2016.03.10 4 旋轉卡殼 5 cdq分治 複習演算法 1 splay 已完成 2016.03.23 2 kmp 3 莫隊演算法 4 主席樹 學習樹狀陣列套主席...

WSL入坑與踩坑

這篇文章,將會娓娓道來我使用wsl的經歷,包括如何安裝以及早期玩家踩的一些坑。這是乙個很好的工具,與vscode簡直是絕配。wsl是什麼 適用於 linux 的 windows 子系統可讓開發人員按原樣執行 gnu linux 環境 包括大多數命令列工具 實用工具和應用程式 且不會產生傳統虛擬機器或...

mysql 坑 mysql入過的坑

前言 前段時間由於工作需要,部署乙個新的專案。需要安裝mysql,因此遇到不少坑。首先是啟動的時候遇到找不到檔案位置的問題,在網上找了下原因,是由於之前安裝了mysql解除安裝的時候沒有解除安裝乾淨有殘留導致的。需要進入登錄檔cmd regedit hkey local machine system...