python模組paramiko與ssh

發表於2016-12-19

paramiko是用python語言寫的一個模組,遵循SSH2協議,支援以加密和認證的方式,進行遠端伺服器的連線。paramiko支援Linux, Solaris, BSD, MacOS X, Windows等平臺通過SSH從一個平臺連線到另外一個平臺。利用該模組,可以方便的進行ssh連線和sftp協議進行sftp檔案傳輸。

一、paramiko模組的安裝

paramiko模組依賴PyCrypto模組,而PyCrypto需要GCC庫編譯,不過一般發行版的源裡帶有該模組。這裡以centos6為例,直接藉助以下命令可以直接完成安裝:

windows版下可以安裝windows版的GCC(MinGW),然後編輯安裝pycrypto和paramiko ,下載安成後,直接執行python.exe setup.py build 和 python.exe setup.py install 就可以了。

二、paramiko的連線

使用paramiko模組有兩種連線方式,一種是通過paramiko.SSHClient()函式,另外一種是通過paramiko.Transport()函式。

方法一:

上面的第二行程式碼的作用是允許連線不在know_hosts檔案中的主機。

方法二:

如果連線遠端主機需要提供金鑰,上面第二行程式碼可改成:

三、paramiko ssh連線

以下是一個簡單的通過paramiko模組定義的ssh連線並執行命令的函式,如下:

其中第四行的日誌部分,是記錄ssh連線互動時的一些資訊,可以看做是類似於debug的輸出,一般情況下不需要開啟。

stdin.write部分是用於互動情況下,通過該命令可以執行互動。注意這裡可能會引起歧義,這裡的互動並不是ssh連線過程中出現的讓輸入yes的互動,因為paramiko模組在連線過程中會自動處理好yes確認。這裡的互動是指後面的cmd需要的執行的程式可能出現互動的情況下,可以通過該引數進行互動。

stdout標準輸出,在輸出內容比較少時,可以通過直接使用read讀取出所有的輸出;但在輸出內容比較多時,建議通過按行讀取進行處理。不過按行讀取時,每行結尾會有換行符n,這樣輸出的結果很不美觀。可以通過strip進行字串的處理。

在函式呼叫過程中需要注意的是,IP、username、passwd都是屬於字串型的,所以需要加引號。後面執行的cmd,如果有多個命令需要操作時,需要通過分號進行分割。

四、paramiko sftp示例

單個檔案小傳下載的示例:

一個目錄下多個檔案上傳下載的示例:

注:本處的目錄下所有檔案進行下載或上傳的示例中,在遇到目錄下還有巢狀的目錄存在時,會將目錄也當做檔案進行處理,所以如果想要更加的完美的話,可以通過引入stat模組下的S_ISDIR方法進行處理

paramiko.transport物件也支援以socket的方式進行連線,如下示例:

五、利用paramiko實現ssh的互動式連線

以下是通過paramiko模組直接用ssh協議登陸到遠端伺服器的操作程式碼,這裡先定義一個interactive模組,程式碼如下:

程式碼內容可以從paramiko 在github專案上的demo裡獲取。再另外寫一個ssh_inter.py的互動主程式,內容如下:

執行效果就像我們平時直接使用ssh登入一樣。

六、總結

paramiko模組是一個比較強大的ssh連線模組,以上的示例只是列出了該模組的一些簡單的使用方法,還可以使用threading模組加塊程式併發的速度;也可以使用configparser模組處理配置檔案,而我們將所有IP、使用者資訊操作都放入配置檔案;使用setproctitle模組為執行的程式加一個容易區分的title等。

同樣,雖然連fabric這樣大名鼎鼎的軟體使用的ssh都是用paramiko模組進行的封裝,不過你依然可以選擇不使用它,你也可以選擇pexpect模組實現封裝一個簡易的ssh連線工具、或者使用同樣比較火的salt-ssh模組。

相關文章