欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

python基于paramiko庫遠程執(zhí)行 SSH 命令,實現(xiàn) sftp 下載文件

 更新時間:2021年03月08日 15:40:07   作者:古明地盆  
這篇文章主要介紹了python基于paramiko庫遠程執(zhí)行 SSH 命令,實現(xiàn) sftp 下載文件的方法,幫助大家更好的理解和學習使用python,感興趣的朋友可以了解下

楔子

我們使用 Python 避免不了和 Linux 打交道,而有時我們需要執(zhí)行一些 shell 命令。如果在本地的話,那么可以通過調(diào)用 os.system 或者 subprocess.Popen 來執(zhí)行,但如果我們希望遠程執(zhí)行其它機器上的 shell 命令,這個時候該怎么做呢?下面我們就來推薦一個第三方庫 paramiko,看看如何使用 Python 遠程操作其它機器。

paramiko

網(wǎng)絡(luò)傳輸是遵循協(xié)議的,比如 SSH,paramiko 則是實現(xiàn)了 SSHv2 協(xié)議的一個 Python 第三方庫(底層使用的是 cryptography)。有了 paramiko 之后,我們便可以通過 Python 使用 SSH 協(xié)議來連接遠程服務(wù)器執(zhí)行操作,和 xshell 本質(zhì)上是類似的。

注意:我們在 Python 代碼中是直接通過 SSH 協(xié)議對遠程服務(wù)器執(zhí)行操作,而不是調(diào)用 ssh 命令對遠程服務(wù)器進行操作。

既然要使用,那么首先要安裝,直接 pip install paramiko 即可。

paramiko 包含兩大核心組件:SSHClient 和 SFTPClient

SSHClient 的作用類似于 Linux 下的 ssh 命令,是對 SSH 會話的封裝,通常用于執(zhí)行遠程命令。

SFTPClient 的作用類似于 Linux 下的 sftp 命令,是對 SFTP 客戶端的封裝,用于實現(xiàn)遠程文件的操作。比如:文件上傳,下載、修改文件權(quán)限等操作。

下面我們就來介紹它們的用法。

SSHClient 的使用

首先創(chuàng)建一個客戶端實例, client = paramiko.SSHClient(),然后這個 client 下有很多方法。

connect:實現(xiàn)遠程服務(wù)器的連接與認證

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ù)如下:

  • hostname:連接的目的主機, 這個參數(shù)是必須的
  • port=SSH_PORT:指定的端口, 默認是 22
  • 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:當遠程服務(wù)器沒有本地秘鑰或 HostKeys 對象時的應(yīng)對策略,目前支持三種:

  • AutoAddPolicy:自動添加主機名以及主機秘鑰到本地 HostKeys 對象, 不依賴 load_system_host_key 的配置, 即新建立 ssh 連接時不需要再輸入 yes 或 no 進行確認
  • WarningPolicy:用于記錄一個未知的主機秘鑰的 Python 警告、并且接收; 所以它的功能和 AutoAddPolicy 是類似的, 只不過會提示這是新連接
  • RejectPolicy:自動拒絕未知的主機名和秘鑰, 依賴 load_system_host_key 的配置, 該選項為默認選項

所以我們一般都會將策略改成 AutoAddPolicy,不然還需要在本地進行配置。

exec_command:遠程執(zhí)行的具體 Linux 命令

open_sftp:在當前 ssh 會話的基礎(chǔ)上創(chuàng)建一個 sftp 會話,該方法會返回一個 SFTPClient 對象,可以執(zhí)行文件的上傳、下載等操作。我們后面在 SFTPClient 的時候會說。

下面我們來演示一下:

import paramiko

# 實例化 SSHClient
client = paramiko.SSHClient()

# 自動添加策略, 保存服務(wù)器的主機名和密鑰信息; 如果不添加, 那么不再本地 know_hosts 文件中的主機將無法連接
client.set_missing_host_key_policy(paramiko.AutoAddPolicy())

# 連接 SSH 服務(wù)端, 通過用戶名和密碼進行認證
# 該過程會創(chuàng)建一個 session, 它是 client 和 server 保持連接的對象
client.connect(hostname='47.94.174.89', port=22, username='root', password='xxxxxxx')

# 執(zhí)行遠程命令, 該方法會打開一個 paramiko.Channel 對象(類 socket, 一種安全的 SSH 傳輸通道)
# 會返回三個值, 分別是 stdin(標準輸入)、stdout(標準輸出)、stderr(錯誤輸出)
stdin, stdout, stderr = client.exec_command("ls /")

# 打印執(zhí)行結(jié)果, 顯然我們要通過 stdout 來查看, 我們可以調(diào)用 stdout.read 獲取執(zhí)行的結(jié)果
# 但是返回的是字節(jié), 所以需要先獲取對應(yīng)的編碼, 然后再進行 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()

還是很簡單的,如果我們輸入了一條錯誤的命令,那么 stdout 里面就不會有內(nèi)容了,因為錯誤信息會保存是在 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 的使用

SFTPClient 作為一個 sftp 的客戶端對象,根據(jù) ssh 傳輸協(xié)議的 sftp 會話,可以實現(xiàn)遠程文件的操作,例如:上傳、下載、查看權(quán)限和狀態(tài)等等。

import paramiko

# 創(chuàng)建一個 Transport 對象, 使用時會同步創(chuàng)建一個 paramiko.Channel 對象
# 參數(shù)傳遞一個由 IP 和 PORT 組成的元組即可
transport = paramiko.Transport(("47.94.174.89", 22))

# 連接 ssh, 通過 username 和 password
transport.connect(username="root", password="xxxxxxx")

# 獲取 SFTPClient 實例, 它便相當于 Linux 下的 sftp, 我們通過它可以進行文件的一些操作
sftp = paramiko.SFTPClient.from_transport(transport)

以上我們便得到的 sftp,那么它都支持哪些操作呢?

  • put(self, localpath, remotepath, callback=None, confirm=True):將本地文件上傳到服務(wù)器, callback 表示回調(diào)函數(shù), 上傳成功后調(diào)用; confirm 表示是否調(diào)用 stat 方法檢查文件狀態(tài), 返回 ls -l 的結(jié)果
  • get(self, remotepath, localpath, callback=None):將文件從服務(wù)器下載到本地
  • mkdir(self, path, mode=o777):在服務(wù)器上創(chuàng)建目錄, mode 表示權(quán)限, 默認為 511(o777 是一個變量, 等于 511)
  • rmdir(self, path):刪除服務(wù)器上的目錄
  • remove(self, path):刪除服務(wù)器上的文件
  • rename(self, oldpath, newpath):對服務(wù)器上目錄進行重命名
  • stat(self, path):查看文件或目錄的狀態(tài)
  • listdir(self, path='.'):列出服務(wù)器目錄下的文件
  • getcwd(self):查看工作區(qū), 也就是當前所在路徑
  • chmod(self, path, mode):改變權(quán)限
  • chown(self, path, uid, gid): 改變用戶和組
  • chdir(self, path):改變工作區(qū)

常用的大概以上這些,我們來演示一下。

# 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) 的時候, 那么打印 sftp.getcwd() 時結(jié)果為 None
但我們知道登陸 Linux 時, 默認會在 /root 目錄(對于 root 用戶而言)
對于當前的 sftp 而言也確實如此, 只不過打印 sftp.getcwd() 的時候結(jié)果為 None 罷了 
"""

# 3. 列出當前目錄下的文件
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()

當然我們在介紹 SSHClient 的時候說過,還可以通過 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庫遠程執(zhí)行 SSH 命令,實現(xiàn) sftp 下載文件的詳細內(nèi)容,更多關(guān)于python paramiko庫的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 一篇文章教你用Python實現(xiàn)一鍵文件重命名

    一篇文章教你用Python實現(xiàn)一鍵文件重命名

    這篇文章主要介紹了如何用python一鍵文件重命名,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-09-09
  • tensorflow 查看梯度方式

    tensorflow 查看梯度方式

    今天小編就為大家分享一篇tensorflow 查看梯度方式,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-02-02
  • Python模擬實現(xiàn)高斯分布擬合

    Python模擬實現(xiàn)高斯分布擬合

    當我們繪制一個數(shù)據(jù)集(如直方圖)時,圖表的形狀就是我們所說的分布,最常見的連續(xù)值形狀是鐘形曲線,也稱為高斯分布或正態(tài)分布,下面我們就來利用Python模擬實現(xiàn)一下高斯分布吧
    2023-12-12
  • Python通過屬性手段實現(xiàn)只允許調(diào)用一次的示例講解

    Python通過屬性手段實現(xiàn)只允許調(diào)用一次的示例講解

    下面小編就為大家分享一篇Python通過屬性手段實現(xiàn)只允許調(diào)用一次的示例講解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-04-04
  • python xpath獲取頁面注釋的方法

    python xpath獲取頁面注釋的方法

    今天小編就為大家分享一篇python xpath獲取頁面注釋的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-01-01
  • Python實現(xiàn)Mysql數(shù)據(jù)庫連接池實例詳解

    Python實現(xiàn)Mysql數(shù)據(jù)庫連接池實例詳解

    這篇文章主要介紹了Python實現(xiàn)Mysql數(shù)據(jù)庫連接池實例詳解的相關(guān)資料,需要的朋友可以參考下
    2017-04-04
  • Tensorflow 查看變量的值方法

    Tensorflow 查看變量的值方法

    今天小編就為大家分享一篇Tensorflow 查看變量的值方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-06-06
  • Python?pyinstaller打包exe最新完整圖文教程

    Python?pyinstaller打包exe最新完整圖文教程

    pyinstaller是一個非常簡單的打包python的py文件的庫,下面這篇文章主要給大家介紹了關(guān)于Python?pyinstaller打包exe的相關(guān)資料,文中介紹的非常詳細,需要的朋友可以參考下
    2023-12-12
  • python數(shù)字圖像處理skimage讀取顯示與保存圖片

    python數(shù)字圖像處理skimage讀取顯示與保存圖片

    這篇文章主要為大家介紹了python數(shù)字圖像處理使用skimage讀取顯示與保存圖片示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-06-06
  • Python 腳本獲取ES 存儲容量的實例

    Python 腳本獲取ES 存儲容量的實例

    今天小編就為大家分享一篇Python 腳本獲取ES 存儲容量的實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-12-12

最新評論