1. 程式人生 > >Python通過paramiko複製遠端檔案及檔案目錄到本地

Python通過paramiko複製遠端檔案及檔案目錄到本地

最近寫運維自動化平臺,需要用python寫很多的小功能模組。
這裡就分享一個用Python的paramiko來實現功能的一段程式碼:
複製遠端伺服器上的檔案及資料夾到本地目錄。
解釋一下什麼叫paramiko:

paramiko是用python寫的一個模組,遵循SSH2協議,支援以加密和認證的方式,進行遠端伺服器的連線。利用該模組,可以方便的進行ssh連線和sftp協議進行sftp檔案傳輸以及遠端命令執行。

安裝paramiko也很簡單,我用的是python3,裝好了pip,可以直接用pip來安裝。
不過由於 paramiko 模組內部依賴pycrypto,所以先下載安裝pycrypto:

pip3 install pycrypto
pip3 install paramiko

好了。我定義一個方法,用於遠端複製檔案。程式碼如下:

import os
import paramiko

def RemoteScp(host_ip, host_port, host_username, host_password, remote_file, local_file):
    scp = paramiko.Transport((host_ip, host_port))
    scp.connect(username=host_username, password=host_password)
    sftp = paramiko.SFTPClient.from_transport(scp)
    sftp.get(remote_file, local_file)
    scp.close()
    return ("success")
   

注意這裡的語句:
sftp.get(remote_file, local_file)中自帶的get方法,只能拷貝檔案目錄,不能拷貝資料夾。
然後呼叫這個方法:

if __name__ == '__main__':
    host_ip = '192.168.1.123'
    host_port = 22
    host_username = 'root'
    host_password = 'password'
    remote_path = '/tmp/test.sql'
    local_path = '/tmp/test.sql'
    RemoteScp(host_ip, host_port, host_username, host_password, remote_path, local_path)

這就是基本遠端檔案複製的功能實現。這裡只能實現檔案對檔案的遠端複製。

如果我們要遠端複製整個資料夾。需要對上面的方法改進一下,加一段迴圈,讓其能遍歷遠端目錄裡的所有檔案,然後按照上面的方法依次複製到本地。

我在程式碼中加了一些註釋。修改以後的完整程式碼如下:

import os
import paramiko

def RemoteScp(host_ip, host_port, host_username, host_password, remote_path, local_path):
    scp = paramiko.Transport((host_ip, host_port))
    scp.connect(username=host_username, password=host_password)
    sftp = paramiko.SFTPClient.from_transport(scp)
    try:
        remote_files = sftp.listdir(remote_path)
        for file in remote_files:   #遍歷讀取遠端目錄裡的所有檔案
            local_file = local_path + file
            remote_file = remote_path + file
            sftp.get(remote_file, local_file)
    except IOError:   #  如果目錄不存在則丟擲異常
        return ("remote_path or local_path is not exist")
    scp.close()


if __name__ == '__main__':
    host_ip = '192.168.1.123'        # 遠端伺服器IP
    host_port = 22                   # 遠端伺服器埠
    host_username = 'root'           #遠端伺服器使用者名稱
    host_password = 'password'       #遠端伺服器密碼
    remote_path = '/tmp/'            #這個是遠端目錄
    local_path = '/tmp/'             #這個是本地目錄
    RemoteScp(host_ip, host_port, host_username, host_password, remote_path, local_path)  #呼叫方法