大技霸教你遠端執行Linux指令碼和命令
阿新 • • 發佈:2020-05-17
如果現在需要在 Linux 伺服器上執行一系列命令(比如搭建 LNMP 環境)我應該會第一時間想到想辦法寫個 Shell 指令碼,然後扔上去執行以下看看結果。
然而一貫懶惰的我並不想這麼去執行 Shell 和一些重複命令。所以俺尋思可以有個方法本地直接在伺服器端執行指令碼,尋思生異端,這時候有某大技霸告訴我有個叫 `paramiko` 的 Python 庫,從此開啟我新世界的大門。
![image](https://img2020.cnblogs.com/other/1218435/202005/1218435-20200517165218479-1625872399.jpg)
對於 paramiko 安裝直接 pip 或者 PyCharm 這裡就不多說了,如果看到這裡你覺得自己不怎麼了解python語法的也不必擔心,你完全可以用 paramiko 單純的執行 Shell 命令檢視結果和上傳下載檔案,省去重複的工作。
paramiko 實現了 SSHv2 協議(底層使用 cryptography ),包含兩個核心元件:SSHClient 和 SFTPClient 。 SSHClient 是對 SSH 會話的封裝,用於執行遠端命令,SFTPClient 是對 SFTP 客戶端的封裝,用以實現遠端檔案操作。
這裡先舉兩個列子你應該就明白怎麼用了,終於開始正片了。
![image](https://img2020.cnblogs.com/other/1218435/202005/1218435-20200517165218751-835241390.jpg)
SSHClient 的列子:
# -*- 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()
輸出:
![image](https://img2020.cnblogs.com/other/1218435/202005/1218435-20200517165219065-1876667928.jpg)
這裡說明一下:
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)的事情了,這裡先舉這個簡單的列子。
SFTPClient 常用方法:
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()`。
#### 看完的都是真愛,點個贊再走唄?您的「三連」就是良許持續創作的最大動力!
1. 關注**原創**公眾號「**良許Linux**」,第一時間獲取最新Linux乾貨!
2. 公眾號後臺回覆【資料】【面試】【簡歷】獲取精選一線大廠面試、自我提升、簡歷等資料。
3. 關注我的部落格:[lxlinux.net](http://www.lxlinux.net)