我們使用 Python 避免不了和 Linux 打交道,而有時(shí)我們需要執(zhí)行一些 shell 命令。如果在本地的話,那么可以通過調(diào)用 os.system 或者 subprocess.Popen 來執(zhí)行,但如果我們希望遠(yuǎn)程執(zhí)行其它機(jī)器上的 shell 命令,這個(gè)時(shí)候該怎么做呢?下面我們就來推薦一個(gè)第三方庫 paramiko,看看如何使用 Python 遠(yuǎn)程操作其它機(jī)器。
網(wǎng)絡(luò)傳輸是遵循協(xié)議的,比如 SSH,paramiko 則是實(shí)現(xiàn)了 SSHv2 協(xié)議的一個(gè) Python 第三方庫(底層使用的是 cryptography)。有了 paramiko 之后,我們便可以通過 Python 使用 SSH 協(xié)議來連接遠(yuǎn)程服務(wù)器執(zhí)行操作,和 xshell 本質(zhì)上是類似的。
注意:我們在 Python 代碼中是直接通過 SSH 協(xié)議對遠(yuǎn)程服務(wù)器執(zhí)行操作,而不是調(diào)用 ssh 命令對遠(yuǎn)程服務(wù)器進(jìn)行操作。
既然要使用,那么首先要安裝,直接 pip install paramiko 即可。
paramiko 包含兩大核心組件:SSHClient 和 SFTPClient
SSHClient 的作用類似于 Linux 下的 ssh 命令,是對 SSH 會(huì)話的封裝,通常用于執(zhí)行遠(yuǎn)程命令。
SFTPClient 的作用類似于 Linux 下的 sftp 命令,是對 SFTP 客戶端的封裝,用于實(shí)現(xiàn)遠(yuǎn)程文件的操作。比如:文件上傳,下載、修改文件權(quán)限等操作。
下面我們就來介紹它們的用法。
首先創(chuàng)建一個(gè)客戶端實(shí)例, client = paramiko.SSHClient(),然后這個(gè) client 下有很多方法。
def connect( self, hostname, port=SSH_PORT, username=None, password=None, pkey=None, key_filename=None, timeout=None, allow_agent=True, look_for_keys=True, compress=False, sock=None, gss_auth=False, gss_kex=False, gss_deleg_creds=True, gss_host=None, banner_timeout=None, auth_timeout=None, gss_trust_dns=True, passphrase=None, disabled_algorithms=None, ): """"""
里面參數(shù)很多,但常用的參數(shù)如下:
所以我們一般都會(huì)將策略改成 AutoAddPolicy,不然還需要在本地進(jìn)行配置。
open_sftp:在當(dāng)前 ssh 會(huì)話的基礎(chǔ)上創(chuàng)建一個(gè) sftp 會(huì)話,該方法會(huì)返回一個(gè) SFTPClient 對象,可以執(zhí)行文件的上傳、下載等操作。我們后面在 SFTPClient 的時(shí)候會(huì)說。
下面我們來演示一下:
import paramiko # 實(shí)例化 SSHClient client = paramiko.SSHClient() # 自動(dòng)添加策略, 保存服務(wù)器的主機(jī)名和密鑰信息; 如果不添加, 那么不再本地 know_hosts 文件中的主機(jī)將無法連接 client.set_missing_host_key_policy(paramiko.AutoAddPolicy()) # 連接 SSH 服務(wù)端, 通過用戶名和密碼進(jìn)行認(rèn)證 # 該過程會(huì)創(chuàng)建一個(gè) session, 它是 client 和 server 保持連接的對象 client.connect(hostname='47.94.174.89', port=22, username='root', password='xxxxxxx') # 執(zhí)行遠(yuǎn)程命令, 該方法會(huì)打開一個(gè) paramiko.Channel 對象(類 socket, 一種安全的 SSH 傳輸通道) # 會(huì)返回三個(gè)值, 分別是 stdin(標(biāo)準(zhǔn)輸入)、stdout(標(biāo)準(zhǔn)輸出)、stderr(錯(cuò)誤輸出) stdin, stdout, stderr = client.exec_command("ls /") # 打印執(zhí)行結(jié)果, 顯然我們要通過 stdout 來查看, 我們可以調(diào)用 stdout.read 獲取執(zhí)行的結(jié)果 # 但是返回的是字節(jié), 所以需要先獲取對應(yīng)的編碼, 然后再進(jìn)行 decode print(stdout.read().decode("utf-8")) """ bin boot dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var """ # 最后關(guān)閉 SSHClient 對象 client.close()
還是很簡單的,如果我們輸入了一條錯(cuò)誤的命令,那么 stdout 里面就不會(huì)有內(nèi)容了,因?yàn)殄e(cuò)誤信息會(huì)保存是在 stderr 中。
import paramiko client = paramiko.SSHClient() client.set_missing_host_key_policy(paramiko.AutoAddPolicy()) client.connect(hostname='47.94.174.89', port=22, username='root', password='xxxxxxx') stdin, stdout, stderr = client.exec_command("xxxxx") print(stderr.read().decode("utf-8")) """ bash: xxxxx: command not found """ client.close()
SFTPClient 作為一個(gè) sftp 的客戶端對象,根據(jù) ssh 傳輸協(xié)議的 sftp 會(huì)話,可以實(shí)現(xiàn)遠(yuǎn)程文件的操作,例如:上傳、下載、查看權(quán)限和狀態(tài)等等。
import paramiko # 創(chuàng)建一個(gè) Transport 對象, 使用時(shí)會(huì)同步創(chuàng)建一個(gè) paramiko.Channel 對象 # 參數(shù)傳遞一個(gè)由 IP 和 PORT 組成的元組即可 transport = paramiko.Transport(("47.94.174.89", 22)) # 連接 ssh, 通過 username 和 password transport.connect(username="root", password="xxxxxxx") # 獲取 SFTPClient 實(shí)例, 它便相當(dāng)于 Linux 下的 sftp, 我們通過它可以進(jìn)行文件的一些操作 sftp = paramiko.SFTPClient.from_transport(transport)
以上我們便得到的 sftp,那么它都支持哪些操作呢?
常用的大概以上這些,我們來演示一下。
# 1. 改變工作區(qū) sftp.chdir("/usr/local/bin") # 2. 查看工作區(qū) print(sftp.getcwd()) # /usr/local/bin sftp.chdir("/root") print(sftp.getcwd()) # /root """ 如果不調(diào)用 sftp.chdir(path) 的時(shí)候, 那么打印 sftp.getcwd() 時(shí)結(jié)果為 None 但我們知道登陸 Linux 時(shí), 默認(rèn)會(huì)在 /root 目錄(對于 root 用戶而言) 對于當(dāng)前的 sftp 而言也確實(shí)如此, 只不過打印 sftp.getcwd() 的時(shí)候結(jié)果為 None 罷了 """ # 3. 列出當(dāng)前目錄下的文件 print(sftp.listdir("/usr/local")) # ['lib', 'lib64', 'games', 'aegis', ...] # 4. 查看文件或目錄狀態(tài) print(sftp.stat("/root/.ssh/authorized_keys")) """ -rw------- 1 0 0 0 16 Dec 13:26 ? """ # 5. 改變權(quán)限 sftp.chmod("/root/.ssh/authorized_keys", 0o777) print(sftp.stat("/root/.ssh/authorized_keys")) """ -rwxrwxrwx 1 0 0 0 16 Dec 13:26 ? """ # 6. 創(chuàng)建目錄 print("dir" in sftp.listdir("/root")) # False sftp.mkdir("/root/dir", mode=0o777) print("dir" in sftp.listdir("/root")) # True # 7. 刪除目錄 sftp.rmdir("/root/dir") print("dir" in sftp.listdir("/root")) # False # 8. 刪除文件 sftp.remove("/root/1.py") # 9. 下載文件 sftp.get("/root/makefile", r"makefile") # 10. 上傳文件 sftp.put("dockerfile", "/root/dockerfile") # 最后關(guān)閉 sftp 和 transport sftp.close() transport.close()
當(dāng)然我們在介紹 SSHClient 的時(shí)候說過,還可以通過 open_sftp 的方式來創(chuàng)建 sftp 客戶端。
import paramiko client = paramiko.SSHClient() client.set_missing_host_key_policy(paramiko.AutoAddPolicy()) client.connect(hostname='47.94.174.89', port=22, username='root', password='xxxxxxx') # 這種方式創(chuàng)建也是可以的 sftp = client.open_sftp()
以上就是python基于paramiko庫遠(yuǎn)程執(zhí)行 SSH 命令,實(shí)現(xiàn) sftp 下載文件的詳細(xì)內(nèi)容,更多關(guān)于python paramiko庫的資料請關(guān)注腳本之家其它相關(guān)文章!
標(biāo)簽:浙江 石家莊 錫林郭勒盟 文山 西寧 懷化 梅州 昆明
巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《python基于paramiko庫遠(yuǎn)程執(zhí)行 SSH 命令,實(shí)現(xiàn) sftp 下載文件》,本文關(guān)鍵詞 python,基于,paramiko,庫,遠(yuǎn)程,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。