Python實踐2-Paramiko實現互信主機間文件傳輸
任務背景
Python的paramiko真乃神器也,不僅把需要用xmlrpclib實現的RPC功能非常簡潔地實現了,還順帶著把用shell scp命令實現的文件傳輸也搞定了。我司測試在平時工作中,主要用它來部署文件和進行遠程控制。由於都是在自己安裝的機器,一般都是在paramiko腳本里指定用戶名和密碼連接遠程機器,用起來十分方便。
但是有一天,突然接到緊急任務,需要在一個小時內,把測試環境部署到客戶的一批機器上去用於演示,而客戶的機器並不會給我們他們機器的用戶名密碼,僅僅是對我們的一台機器進行了授權,允許我們使用私鑰登陸這批機器,也就是常說的免密碼登陸。由於當時對paramiko不熟,沒能搞明白如何讓paramiko免密碼進行文件傳輸,考慮到任務緊急,只好用scp的老方法部署文件,用是能湊合著用,但是心裡一直不爽。
解決問題
後來花了點時間,整理了一下如何在互信的主機間使用paramiko傳輸文件,供大家參考。(其實簡單的要死)
準備環境
下面就請各位跟著我一步一步開始吧。
準備兩台主機,假設host1 ip:192.168.253.156, host2 ip:192.168.253.157
我們的目標是將host1上的文件分發到host2上去,文件為test.txt
首先,讓host1能夠免密碼登陸host2。這裡面需要3小步操作:
- 在host1上運行, ssh-keygen -t rsa,一路回車,這樣會在你的用戶root的目錄下生成.ssh目錄,裡面包含了你root用戶的公鑰文件 id_rsa.pub和私鑰文件 id_rsa
- 在host1上運行,ssh-copy-id root@192.168.253.157,當需要確認時,輸入yes,然後緊接著輸入host2的root用戶密碼。這句命令將會將你的公鑰內容複製到host2的受信任秘鑰文件authorized_keys里去。當你使用host1的私鑰登陸host2時,host2會使用authorized_keys裡面存儲的host1公鑰來進行身份驗證。
- 在host1運行 ssh root@192.168.253.157,如果沒有任何報錯,就證明你已經可以讓host1免密碼登陸host2了。注意,這時你已經在host2上面登陸了,別忘了使用exit退出host2的登陸。
安裝Paramiko庫
接著,在host1上面安裝paramiko庫,又是簡單的要死,一句話: pip install paramiko -y
編寫代碼
然後創建一個Python文件paramiko_with_key.py,內容如下,主要語句的注釋已經寫好了,大家可以照葫蘆畫瓢試試。我上傳到github的代碼裡面還有遠程執行命令的功能,大家如果有需要可以去圍觀下。
地址如下:https://github.com/jumper2014/Asgard/blob/master/samples/paramiko_with_key.py
import paramikonnif __name__ == "__main__":n remote_host = 192.168.253.157n ssh_port = 22n username = rootnn # 載入RSA私鑰n private_key_file = /root/.ssh/id_rsan key = paramiko.RSAKey.from_private_key_file(private_key_file)nn # 上傳文件到遠程主機n t = paramiko.Transport((remote_host, ssh_port))n t.connect(username=user_name, pkey=key)n sftp = paramiko.SFTPClient.from_transport(t)n # 上傳當前目錄下的文件到遠程主機的/root/目錄下n # 也可以直接指定絕對路徑n sftp.put("test.txt", "test.txt")n t.close()n
代碼下載
本文code已經歸檔到github,您可以訪問下面的鏈接獲得。歡迎star該代碼倉庫。
代碼地址如果覺得本文對您有幫助,敬請點贊。
推薦閱讀: