若是如今須要在 Linux 服務器上執行一系列命令(好比搭建 LNMP 環境)我應該會第一時間想到想辦法寫個 Shell 腳本,而後扔上去執行如下看看結果。python
然而一向懶惰的我並不想這麼去執行 Shell 和一些重複命令。因此俺尋思能夠有個方法本地直接在服務器端執行腳本,尋思生異端,這時候有某大技霸告訴我有個叫 paramiko
的 Python 庫,今後開啓我新世界的大門。linux
對於 paramiko 安裝直接 pip 或者 PyCharm 這裏就很少說了,若是看到這裏你以爲本身不怎麼了解python語法的也沒必要擔憂,你徹底能夠用 paramiko 單純的執行 Shell 命令查看結果和上傳下載文件,省去重複的工做。面試
paramiko 實現了 SSHv2 協議(底層使用 cryptography ),包含兩個核心組件:SSHClient 和 SFTPClient 。 SSHClient 是對 SSH 會話的封裝,用於執行遠程命令,SFTPClient 是對 SFTP 客戶端的封裝,用以實現遠程文件操做。shell
這裏先舉兩個列子你應該就明白怎麼用了,終於開始正片了。服務器
SSHClient 的列子:ssh
# -*- coding: utf-8 -*- import paramiko client = paramiko.SSHClient()# 實例化SSHClient client.set_missing_host_key_policy(paramiko.AutoAddPolicy())# 自動添加策略,保存服務器的主機名和密鑰信息,若是不添加,那麼再也不本地know_hosts文件中記錄的主機將沒法鏈接 client.connect(hostname='192.168.23.134', port=22, username='ftoz', password='123456')# 鏈接SSH服務端,以用戶名和密碼進行認證 # 打開一個Channel並執行命令 stdin, stdout, stderr = client.exec_command('ls') # stdout 爲正確輸出,stderr爲錯誤輸出,同時是有1個變量有值 # 打印執行結果 print(stdout.read().decode('utf-8')) # 關閉SSHClient client.close()
輸出:tcp
這裏說明一下:url
client = paramiko.SSHClient(), client.set_missing_host_key_policy(paramiko.AutoAddPolicy())你能夠理解爲固定姿式。 client.connect(hostname='192.168.1.105', port=22, username='ftoz',password='123456')這裏就是你的linux變量依次爲地址、端口(總共65535個端口,不過ssh默認是22端口)、登陸名、密碼。 stdin, stdout, stderr = client.exec_command('df -h ') 這裏就是核心你須要作的shell命令,這三個變量不用按照這種姿式,你能夠隨意,不過按照順序你知道里面裝的什麼數據就行(重點在輸出和錯誤)。 connect():這個是實現遠程服務器鏈接和認證的,參數有: hostname 鏈接的目標主機 port=SSH_PORT 指定端口 username=None 驗證的用戶名 password=None 驗證的用戶密碼 pkey=None 私鑰方式用於身份驗證 key_filename=None 一個文件名或文件列表,指定私鑰文件 timeout=None 可選的tcp鏈接超時時間 allow_agent=True, 是否容許鏈接到ssh代理,默認爲True 容許 look_for_keys=True 是否在~/.ssh中搜索私鑰文件,默認爲True 容許 compress=False, 是否打開壓縮。 set_missing_host_key_policy():這個是設置遠程服務器沒有在know_hosts文件中記錄時的應對策略。(能夠理解爲避免報錯),參數有: AutoAddPolicy 自動添加主機名及主機密鑰到本地HostKeys對象,不依賴load_system_host_key的配置。即新創建ssh鏈接時不須要再輸入yes或no進行確認 WarningPolicy 用於記錄一個未知的主機密鑰的python警告。並接受,功能上和AutoAddPolicy相似,可是會提示是新鏈接 RejectPolicy 自動拒絕未知的主機名和密鑰,依賴load_system_host_key的配置。此爲默認選項 exec_command():這是寫你須要執行的命令的
接下來你就能夠拿出輸出作一些該幹嗎(ke)幹嗎(pa)的事情了,這裏先舉這個簡單的列子。spa
SFTPClient 經常使用方法:.net
t = paramiko.Transport(('192.168.23.134', 22))# 獲取Transport實例 t.connect(username='ftoz', password='123456')# 鏈接SSH服務端,使用password sftp = paramiko.SFTPClient.from_transport(t) sftp.put("F:\S12312.txt","/home/ftoz/zxc12312.txt")#執行上傳動做 sftp.get("/home/ftoz/zxc12312.txt", "F:\S12312.txt")#執行下載動做 t.close()
SFTPCLient 做爲一個 sftp 的客戶端對象,根據 ssh 傳輸協議的 sftp 會話,實現遠程文件操做,如上傳、下載、權限、狀態
from_transport(cls,t) 建立一個已連通的SFTP客戶端通道 put(localpath, remotepath, callback=None, confirm=True) 將本地文件上傳到服務器 參數confirm:是否調用stat()方法檢查文件狀態,返回ls -l的結果 get(remotepath, localpath, callback=None) 從服務器下載文件到本地 mkdir() 在服務器上建立目錄 remove() 在服務器上刪除目錄 rename() 在服務器上重命名目錄 stat() 查看服務器文件狀態 listdir() 列出服務器目錄下的文件
最後養成隨關閉的好習慣 client.close()
。
看完的都是真愛,點個贊再走唄?您的「三連」就是良許持續創做的最大動力!
- 關注原創公衆號「良許Linux」,第一時間獲取最新Linux乾貨!
- 公衆號後臺回覆【資料】【面試】【簡歷】獲取精選一線大廠面試、自我提高、簡歷等資料。
- 關注個人博客:lxlinux.net