一、腳本編寫思路
(一)針對設備型號
主要針對華為(Huawei)和華三(H3C)交換機設備的配置備份
(二)導出前預處理
1.在配置導出前,自動打開crt軟件或者MobaXterm軟件,并自動登錄交換機,進行配置導出。
4.自動檢測被導出交換機是否搭建ftp配置,如果沒有配置ftp服務,自動完善ftp配置,并自動完善交換機設備和電腦ftp配置文件的傳輸設備。
2.需要密碼登錄的交換機,在桌面自動讀取一個表格文檔,名稱為:【交換機設備信息表】的表格文件。
3.根據讀取到的文檔,新建ssh會話,輸入文本的IP,管理員賬號和密碼,并自動登錄設備。
(三)配置文件導出格式
1.將所有配置導出文件保存到桌面并新建一個文件夾名稱為:時間戳+交換機,
2.每個導出交換機配置名稱保存為:設備命名+設備型號+時間戳。 ? ?
3.導出的同一設備配置文件格式必須同時包含TXT文本和cfg
二、函數依賴庫
為了運行Python腳本,需要確保已經安裝了幾個特定的Python庫。這些庫包括用于處理網絡連接、文件操作和數據處理的工具。以下是必須安裝的庫列表及其用途:
- paramiko: 用于處理SSH連接和會話,這對于與交換機進行通信非常重要。
- pandas: 用于讀取和處理Excel文件中的數據,這是從桌面讀取設備信息的關鍵部分。
- openpyxl: 這不是腳本中直接提到的,但它是
pandas
用于處理Excel文件的依賴庫,特別是.xlsx
文件。 - socket: 這是標準庫中的一部分,用于獲取本機IP地址,通常不需要單獨安裝。
(一)安裝步驟
你可以通過Python的包管理器pip來安裝所需的庫。在你的命令行工具中運行以下命令來安裝這些庫:
pip install paramiko pandas openpyxl
這條命令會安裝paramiko
和pandas
,同時確保openpyxl
也被安裝,使得pandas
可以處理Excel文件。
(二)確保環境配置正確
在運行腳本之前,還應確保你的Python環境配置正確,特別是Python版本。這個腳本應該在Python 3.x環境中運行無誤。你可以通過運行python --version
或python3 --version
(取決于你的系統配置)來檢查你的Python版本。
(三)安裝示例
(四)確保環境配置正確
在運行腳本之前,還應確保你的Python環境配置正確,特別是Python版本。這個腳本應該在Python 3.x環境中運行無誤。你可以通過運行python --version
或python3 --version
(取決于你的系統配置)來檢查你的Python版本。
如果你是在一個新的環境或虛擬環境中工作,確保所有庫都按需安裝。這樣可以避免影響系統中其他Python項目的依賴。
三、Python腳本
import paramiko # 導入paramiko庫用于SSH連接
import pandas as pd # 導入pandas庫處理Excel文件
import os # 導入os庫進行文件系統操作
from datetime import datetime # 導入datetime庫獲取時間戳
import time # 導入time庫用于暫停操作
import socket # 導入socket庫用于獲取本機IP地址# 讀取設備信息表
def read_device_info():file_path = os.path.join(os.path.expanduser('~'), 'Desktop', '交換機設備信息表.xlsx') # 構造文件路徑return pd.read_excel(file_path) # 使用pandas讀取Excel文件并返回# 獲取本機IP地址
def get_local_ip():s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) # 創建UDP sockettry:s.connect(('10.255.255.255', 1)) # 嘗試連接到一個不存在的地址以獲取本機IPIP = s.getsockname()[0] # 獲取成功后的本機IP地址except Exception:IP = '127.0.0.1' # 如果獲取失敗,使用本地回環地址finally:s.close() # 關閉socketreturn IP# 創建文件夾用于存放配置
def create_folder():timestamp = datetime.now().strftime("%Y%m%d%H%M%S") # 獲取當前時間戳folder_name = f"{timestamp}_交換機" # 定義文件夾名folder_path = os.path.join(os.path.expanduser('~'), 'Desktop', folder_name) # 定義完整路徑os.makedirs(folder_path, exist_ok=True) # 創建文件夾,如果存在則忽略return folder_path# 設置FTP服務
def setup_ftp(ssh, local_ip):commands = ['display ftp-server configuration\n', # 查看FTP服務器配置'ftp server enable\n', # 啟用FTP服務的命令f'ftp server acl permit source ip {local_ip}\n' # 設置FTP服務的訪問控制,允許本機IP訪問]ssh.send(commands[0]) # 發送第一個命令time.sleep(2) # 等待命令執行output = ssh.recv(65535).decode('utf-8') # 讀取輸出if 'FTP server is not configured' in output: # 如果FTP服務未配置for command in commands[1:]: # 遍歷并執行剩余命令ssh.send(command)time.sleep(1)# 導出配置文件
def export_config(ip, username, password, device_info, folder_path):client = paramiko.SSHClient() # 創建SSH客戶端client.set_missing_host_key_policy(paramiko.AutoAddPolicy()) # 自動接受新的SSH密鑰client.connect(ip, username=username, password=password) # 連接到設備local_ip = get_local_ip() # 獲取本機IP地址with client.invoke_shell() as ssh: # 開啟一個新的SSH會話setup_ftp(ssh, local_ip) # 調用函數檢查并配置FTPcommands = ['display current-configuration\n', 'save\n'] # 定義配置備份命令for command in commands: # 循環發送命令ssh.send(command)time.sleep(5) # 等待命令執行output = ssh.recv(65535).decode('utf-8') # 讀取配置輸出timestamp = datetime.now().strftime("%Y%m%d%H%M%S") # 重新獲取時間戳filename_base = f"{device_info['設備命名']}_{device_info['設備型號']}_{timestamp}" # 構造文件名with open(os.path.join(folder_path, f"{filename_base}.txt"), 'w') as file_txt: # 保存為txt文件file_txt.write(output)with open(os.path.join(folder_path, f"{filename_base}.cfg"), 'w') as file_cfg: # 保存為cfg文件file_cfg.write(output)client.close() # 關閉SSH客戶端# 主函數
def main():folder_path = create_folder() # 創建文件夾device_info = read_device_info() # 讀取設備信息for index, row in device_info.iterrows(): # 遍歷設備信息export_config(row['IP'], row['管理員賬號'], row['密碼'], row, folder_path) # 導出配置if __name__ == "__main__":main() # 運行主函數