在網路自動化和系統管理中,檔案傳輸扮演著至關重要的角色。Python 提供了豐富的函式庫,簡化了與 FTP 和 SFTP 伺服器的互動。本文將會逐步示範如何使用 ftplibftpretty 進行 FTP 操作,以及如何使用 paramiko 進行 SFTP 操作。同時,我們也會探討 Netmiko 函式庫,瞭解如何利用 SCP 協定進行檔案傳輸,並分享一些提升效率和安全性的最佳實務,例如更改遠端主機的預設目錄、顯示檔案傳輸進度,以及使用平行處理來加速檔案傳輸。

使用Python進行檔案傳輸:FTP與SFTP實作

在網路管理與自動化領域,檔案傳輸是常見的需求。Python提供了多個函式庫來支援檔案傳輸協定(FTP)與安全檔案傳輸協定(SFTP)。本篇文章將介紹如何使用ftplibftpretty函式庫進行FTP操作,以及使用paramiko函式庫進行SFTP操作。

使用ftplib進行FTP操作

首先,我們來看看如何使用ftplib連線FTP伺服器並進行檔案大小的比較。

連線FTP伺服器並比較檔案大小

import ftplib
import re
import os

host = "10.10.30.1"
username = "admin"
password = "huawei"
filename = "test.txt"
files = []

# 連線FTP伺服器
ftp = ftplib.FTP(host, username, password)

# 取得FTP伺服器上的檔案列表
output = ftp.dir(files.append)
files = " ".join(files)

# 使用正規表示式擷取指設定檔案的大小
file_size = re.findall(f"(\d+)\s+\w+\s+\d+\s+\d+:\d+\s+{filename}", files)

# 取得本地檔案的大小
local = os.path.getsize(filename)

# 比較本地檔案與FTP伺服器上檔案的大小
if int(local) == int(file_size[0]):
    print(f"'{filename}': '{local}' Bytes. It's same on local and remote host.")
else:
    print("ERROR: File size has problem.")

內容解密:

  1. 連線FTP伺服器:使用ftplib.FTP()函式連線到指定的FTP伺服器,需要提供主機IP、使用者名稱和密碼。
  2. 取得檔案列表:呼叫ftp.dir()函式將FTP伺服器上的檔案列表寫入files列表中。
  3. 擷取檔案大小:使用正規表示式從檔案列表中擷取指設定檔案的大小。
  4. 比較檔案大小:比較本地檔案與FTP伺服器上檔案的大小,以確保兩者一致。

使用ftpretty進行FTP操作

ftpretty是一個簡化FTP操作的函式庫,可以用來上傳、下載檔案以及建立目錄。

上傳與下載檔案

from ftpretty import ftpretty

host = "10.10.10.1"
username = "admin"
password = "cisco"

def upload(local_file, remote_file):
    ftp = ftpretty(host, username, password)
    ftp.put(local_file, remote_file)
    ftp.close()

def download(local_file, remote_file):
    ftp = ftpretty(host, username, password)
    ftp.get(remote_file, local_file)
    ftp.close()

upload("test.txt", "test.txt")

內容解密:

  1. 建立FTP連線:在uploaddownload函式中建立ftpretty物件以連線FTP伺服器。
  2. 上傳檔案:使用ftp.put()函式將本地檔案上傳到FTP伺服器。
  3. 下載檔案:使用ftp.get()函式將FTP伺服器上的檔案下載到本地。
  4. 關閉連線:操作完成後,使用ftp.close()關閉FTP連線。

使用paramiko進行SFTP操作

SFTP是一種更安全的檔案傳輸協定,paramiko函式庫提供了SFTP的支援。

SFTP操作範例

import paramiko

# 建立SSH客戶端
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())

# 連線SFTP伺服器
ssh.connect("10.10.30.1", username="admin", password="huawei")

# 建立SFTP客戶端
sftp = ssh.open_sftp()

# 上傳檔案
sftp.put("local_file.txt", "remote_file.txt")

# 下載檔案
sftp.get("remote_file.txt", "local_file.txt")

# 關閉SFTP連線
sftp.close()
ssh.close()

內容解密:

  1. 建立SSH客戶端:使用paramiko.SSHClient()建立SSH客戶端,並設定主機金鑰策略。
  2. 連線SFTP伺服器:使用ssh.connect()連線到SFTP伺服器。
  3. 建立SFTP客戶端:透過ssh.open_sftp()建立SFTP客戶端。
  4. 上傳與下載檔案:使用sftp.put()sftp.get()進行檔案的上傳和下載。
  5. 關閉連線:操作完成後,關閉SFTP和SSH連線。

網路裝置檔案傳輸技術詳解

在網路管理和系統管理領域,檔案傳輸是常見且重要的操作。本文將探討如何使用 Python 中的 Paramiko 和 Netmiko 模組來實作安全檔案傳輸。

使用 Paramiko 進行 SFTP 檔案傳輸

SFTP(Secure File Transfer Protocol)是一種安全的檔案傳輸協定,常用於網路裝置和系統之間的檔案傳輸。Paramiko 是一個 Python 模組,提供了 SSH 和 SFTP 的實作。

建立 SFTP 連線

首先,我們需要建立一個 SFTP 連線到遠端主機。這可以透過以下步驟完成:

  1. 匯入 Paramiko 模組。
  2. 建立一個 sftp_connect 函式,使用 paramiko.SSHClient() 建立 SSH 連線。
  3. 使用 set_missing_host_key_policyconnect 方法組態連線。
  4. 使用 open_sftp 方法建立 SFTP 連線。
import paramiko

def sftp_connect():
    ssh = paramiko.SSHClient()
    ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
    ssh.connect(hostname="10.10.30.1", username="admin", password="huawei")
    sftp = ssh.open_sftp()
    return sftp

內容解密:

  • paramiko.SSHClient():建立 SSH 客戶端物件,用於連線到遠端主機。
  • set_missing_host_key_policy(paramiko.AutoAddPolicy()):設定主機金鑰政策,自動新增主機金鑰。
  • ssh.connect():使用指定的主機名稱、使用者名稱和密碼連線到遠端主機。
  • ssh.open_sftp():開啟 SFTP 連線。

上傳和下載檔案

建立 SFTP 連線後,我們可以進行檔案上傳和下載操作。

def sftp_upload(local_file, remote_file):
    sftp_connect().put(local_file, remote_file)
    sftp_connect().close()

def sftp_download(remote_file, local_file):
    sftp_d = sftp_connect()
    sftp_d.get(remote_file, local_file)
    sftp_d.close()

內容解密:

  • sftp_connect().put():上傳本地檔案到遠端主機。
  • sftp_connect().get():從遠端主機下載檔案到本地。
  • sftp_connect().close():關閉 SFTP 連線。

使用 Netmiko 進行 SCP 檔案傳輸

SCP(Secure Copy Protocol)是另一種安全的檔案傳輸協定。Netmiko 是一個 Python 模組,提供了對多種網路裝置的支援,包括 SCP 檔案傳輸。

使用 Netmiko 的 file_transfer 函式

Netmiko 的 file_transfer 函式可以用於 SCP 檔案傳輸。

from netmiko import Netmiko, file_transfer

# 設定裝置連線資訊
device = {
    'device_type': 'cisco_ios',
    'ip': '10.10.30.1',
    'username': 'admin',
    'password': 'huawei',
}

# 建立 Netmiko 連線
net_connect = Netmiko(**device)

# 使用 file_transfer 函式進行檔案傳輸
file_transfer(net_connect, source_file='local_file.txt', dest_file='remote_file.txt', direction='put')

內容解密:

  • Netmiko(**device):建立 Netmiko 連線到網路裝置。
  • file_transfer():使用 SCP 協定進行檔案傳輸,支援上傳和下載操作。

利用 Netmiko 實作 SCP 檔案傳輸的技術解析

在網路裝置管理中,安全地傳輸檔案是一項基本且重要的任務。Netmiko 是一個 Python 函式庫,提供了簡便的方式來與網路裝置進行互動,包括使用 SCP(Secure Copy Protocol)進行檔案傳輸。本文將探討如何利用 Netmiko 實作 SCP 檔案傳輸,並提供詳細的程式碼範例和解析。

Netmiko SCP 檔案傳輸基礎

首先,我們需要了解如何使用 Netmiko 建立與網路裝置的 SSH 連線,並使用 SCP 進行檔案傳輸。以下是一個基本的範例:

from netmiko import Netmiko, file_transfer

# 定義裝置連線資訊
device = {
    "host": "10.10.10.1",
    "username": "admin",
    "password": "cisco",
    "device_type": "cisco_ios",
    "global_delay_factor": 0.1
}

# 建立 SSH 連線
net_connect = Netmiko(**device)

# 使用 SCP 上傳檔案
file_transfer(net_connect, source_file="test.txt", dest_file="test.txt", direction="put")

# 終止 SSH 連線
net_connect.disconnect()

程式碼解析:

  1. 匯入必要的模組:我們從 netmiko 匯入 Netmikofile_transfer 函式。
  2. 定義裝置連線資訊:建立一個字典 device,包含主機 IP、使用者名稱、密碼、裝置型別等資訊。
  3. 建立 SSH 連線:使用 Netmiko 函式建立與裝置的 SSH 連線,並將連線物件指定給 net_connect
  4. SCP 檔案傳輸:呼叫 file_transfer 函式,上傳本地檔案 test.txt 到遠端裝置,檔名保持不變。direction="put" 表示上傳操作。
  5. 終止 SSH 連線:完成檔案傳輸後,使用 disconnect 方法終止 SSH 連線。

從 JSON 檔案讀取多裝置資訊進行 SCP 檔案傳輸

在實際應用中,我們可能需要對多台裝置進行相同的操作。以下範例展示瞭如何從一個 JSON 檔案中讀取多台裝置的連線資訊,並對這些裝置進行 SCP 檔案傳輸:

{
    "Router-1": [
        {
            "host": "10.10.10.1",
            "username": "admin",
            "password": "cisco",
            "device_type": "cisco_ios",
            "global_delay_factor": 0.1
        }
    ],
    "Router-2": [
        {
            "host": "10.10.10.2",
            "username": "admin",
            "password": "cisco",
            "device_type": "cisco_ios",
            "global_delay_factor": 0.1
        }
    ],
    "Router-3": [
        {
            "host": "10.10.10.3",
            "username": "admin",
            "password": "cisco",
            "device_type": "cisco_ios",
            "global_delay_factor": 0.1
        }
    ]
}
from netmiko import Netmiko, file_transfer
import json

def json_device():
    host_list = []
    with open('device_list.json') as json_file:
        data = json.load(json_file)
        for item in data.items():
            host = item[1][0]
            host_list.append(host)
    return host_list

host = json_device()
for ip in host:
    net_connect = Netmiko(**ip)
    file_transfer(net_connect, source_file="test.txt", dest_file="test111.txt", direction="put")
    net_connect.disconnect()

程式碼解析:

  1. 定義函式讀取 JSON 檔案json_device 函式開啟並解析 device_list.json 檔案,將裝置資訊提取到一個列表 host_list 中。
  2. 遍歷裝置列表進行 SCP 檔案傳輸:對 host_list 中的每個裝置,建立 SSH 連線,使用 SCP 上傳檔案,並斷開連線。

使用可選引數增強 SCP 檔案傳輸功能

Netmiko 的 file_transfer 函式提供了多個可選引數,以增強檔案傳輸的功能,例如檢查 MD5 值或覆寫已存在檔案。

file_transfer(net_connect, source_file="test.txt", dest_file="test.txt", direction="put", disable_md5=True)
file_transfer(net_connect, source_file="test.txt", dest_file="test.txt", direction="put", overwrite_file=True)

程式碼解析:

  1. disable_md5=True:停用 MD5 校驗,不檢查源檔案和目標檔案的 MD5 值。
  2. overwrite_file=True:如果目標檔案已存在,則覆寫它。

使用 Netmiko 進行檔案傳輸的最佳實踐

Netmiko 是一個強大的 Python 函式庫,用於簡化網路裝置的連線和操作。在本文中,我們將探討如何使用 Netmiko 進行檔案傳輸,並介紹一些最佳實踐。

更改遠端主機的預設目錄

當我們使用 Netmiko 將檔案上傳到 Cisco 路由器時,預設情況下,檔案會被上傳到 flash: 目錄。但是,我們可以透過 file_system 引數更改上傳目錄。

file_transfer(net_connect,
              source_file="test.txt",
              dest_file="test123.txt",
              direction="put",
              file_system="flash2:")

在上述範例中,我們將檔案上傳到 flash2: 目錄。執行 dir flash2: 命令後,我們可以看到檔案已成功上傳到指定的目錄。

檢視檔案傳輸進度

Netmiko 的一個強大功能是可以在輸出中檢視檔案傳輸的進度。我們需要從 Netmiko 模組匯入 progress_bar 函式,並在 file_transfer 函式中新增 progress4=progress_bar

from netmiko import progress_bar

file_transfer(net_connect,
              source_file="test.txt",
              dest_file="test.txt",
              direction="put",
              file_system="flash:",
              overwrite_file=True,
              progress4=progress_bar)

內容解密:

  1. 匯入 progress_bar 函式:從 Netmiko 模組匯入 progress_bar 函式,以便在檔案傳輸過程中顯示進度。
  2. file_transfer 函式引數:在 file_transfer 函式中,設定 progress4=progress_bar 以啟用進度顯示。
  3. 檔案傳輸進度顯示:執行程式碼後,檔案傳輸的進度將以百分比形式顯示在輸出中。

使用平行處理加速檔案傳輸

當需要將檔案上傳到多台裝置時,序列上傳可能會耗費大量時間。為瞭解決這個問題,我們可以使用 Python 的平行處理功能。

from concurrent.futures import ThreadPoolExecutor
from netmiko import Netmiko, file_transfer, progress_bar

def get_ip_address():
    with open("device_list.txt") as r:
        host_list = r.read().splitlines()
    return host_list

def netmiko_scp(ip):
    host = {"ip": ip, "username": "admin", "password": "cisco", "device_type": "cisco_ios"}
    print(f"
---
嘗試登入{ip}
---
")
    net_connect = Netmiko(**host)
    file_transfer(net_connect,
                  source_file="test.txt",
                  dest_file="eee.txt",
                  direction="put",
                  file_system="flash:",
                  overwrite_file=True,
                  progress4=progress_bar)
    net_connect.disconnect()
    return

with ThreadPoolExecutor() as executor:
    host_ip = get_ip_address()
    executor.map(netmiko_scp, host_ip)

內容解密:

  1. 平行處理:使用 ThreadPoolExecutor 實作平行處理,加速多台裝置的檔案傳輸。
  2. get_ip_address 函式:從檔案中讀取 IP 地址列表。
  3. netmiko_scp 函式:建立 Netmiko 連線並傳輸檔案。
  4. executor.map 方法:將 netmiko_scp 函式對映到 IP 地址列表,實作平行處理。