在網路自動化和系統管理中,檔案傳輸扮演著至關重要的角色。Python 提供了豐富的函式庫,簡化了與 FTP 和 SFTP 伺服器的互動。本文將會逐步示範如何使用 ftplib 和 ftpretty 進行 FTP 操作,以及如何使用 paramiko 進行 SFTP 操作。同時,我們也會探討 Netmiko 函式庫,瞭解如何利用 SCP 協定進行檔案傳輸,並分享一些提升效率和安全性的最佳實務,例如更改遠端主機的預設目錄、顯示檔案傳輸進度,以及使用平行處理來加速檔案傳輸。
使用Python進行檔案傳輸:FTP與SFTP實作
在網路管理與自動化領域,檔案傳輸是常見的需求。Python提供了多個函式庫來支援檔案傳輸協定(FTP)與安全檔案傳輸協定(SFTP)。本篇文章將介紹如何使用ftplib與ftpretty函式庫進行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.")
內容解密:
- 連線FTP伺服器:使用
ftplib.FTP()函式連線到指定的FTP伺服器,需要提供主機IP、使用者名稱和密碼。 - 取得檔案列表:呼叫
ftp.dir()函式將FTP伺服器上的檔案列表寫入files列表中。 - 擷取檔案大小:使用正規表示式從檔案列表中擷取指設定檔案的大小。
- 比較檔案大小:比較本地檔案與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")
內容解密:
- 建立FTP連線:在
upload和download函式中建立ftpretty物件以連線FTP伺服器。 - 上傳檔案:使用
ftp.put()函式將本地檔案上傳到FTP伺服器。 - 下載檔案:使用
ftp.get()函式將FTP伺服器上的檔案下載到本地。 - 關閉連線:操作完成後,使用
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()
內容解密:
- 建立SSH客戶端:使用
paramiko.SSHClient()建立SSH客戶端,並設定主機金鑰策略。 - 連線SFTP伺服器:使用
ssh.connect()連線到SFTP伺服器。 - 建立SFTP客戶端:透過
ssh.open_sftp()建立SFTP客戶端。 - 上傳與下載檔案:使用
sftp.put()和sftp.get()進行檔案的上傳和下載。 - 關閉連線:操作完成後,關閉SFTP和SSH連線。
網路裝置檔案傳輸技術詳解
在網路管理和系統管理領域,檔案傳輸是常見且重要的操作。本文將探討如何使用 Python 中的 Paramiko 和 Netmiko 模組來實作安全檔案傳輸。
使用 Paramiko 進行 SFTP 檔案傳輸
SFTP(Secure File Transfer Protocol)是一種安全的檔案傳輸協定,常用於網路裝置和系統之間的檔案傳輸。Paramiko 是一個 Python 模組,提供了 SSH 和 SFTP 的實作。
建立 SFTP 連線
首先,我們需要建立一個 SFTP 連線到遠端主機。這可以透過以下步驟完成:
- 匯入 Paramiko 模組。
- 建立一個
sftp_connect函式,使用paramiko.SSHClient()建立 SSH 連線。 - 使用
set_missing_host_key_policy和connect方法組態連線。 - 使用
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()
程式碼解析:
- 匯入必要的模組:我們從
netmiko匯入Netmiko和file_transfer函式。 - 定義裝置連線資訊:建立一個字典
device,包含主機 IP、使用者名稱、密碼、裝置型別等資訊。 - 建立 SSH 連線:使用
Netmiko函式建立與裝置的 SSH 連線,並將連線物件指定給net_connect。 - SCP 檔案傳輸:呼叫
file_transfer函式,上傳本地檔案test.txt到遠端裝置,檔名保持不變。direction="put"表示上傳操作。 - 終止 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()
程式碼解析:
- 定義函式讀取 JSON 檔案:
json_device函式開啟並解析device_list.json檔案,將裝置資訊提取到一個列表host_list中。 - 遍歷裝置列表進行 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)
程式碼解析:
disable_md5=True:停用 MD5 校驗,不檢查源檔案和目標檔案的 MD5 值。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)
內容解密:
- 匯入
progress_bar函式:從 Netmiko 模組匯入progress_bar函式,以便在檔案傳輸過程中顯示進度。 file_transfer函式引數:在file_transfer函式中,設定progress4=progress_bar以啟用進度顯示。- 檔案傳輸進度顯示:執行程式碼後,檔案傳輸的進度將以百分比形式顯示在輸出中。
使用平行處理加速檔案傳輸
當需要將檔案上傳到多台裝置時,序列上傳可能會耗費大量時間。為瞭解決這個問題,我們可以使用 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)
內容解密:
- 平行處理:使用
ThreadPoolExecutor實作平行處理,加速多台裝置的檔案傳輸。 get_ip_address函式:從檔案中讀取 IP 地址列表。netmiko_scp函式:建立 Netmiko 連線並傳輸檔案。executor.map方法:將netmiko_scp函式對映到 IP 地址列表,實作平行處理。