最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python腳本實(shí)現(xiàn)批量修改交換機(jī)

 更新時(shí)間:2026年05月11日 09:29:03   作者:normanhere  
本文介紹了一個(gè)基于Python和Netmiko庫的多廠商交換機(jī)批量配置腳本,該腳本主要功能包括支持華三、華為、思科、銳捷、中興等主流品牌交換機(jī)配置,感興趣的小伙伴可以了解下

本地wimdows環(huán)境,安裝好python最新版本的,安裝netmiko庫。

所有文件位于C:\1 文件夾

編寫如下腳本命名為 batch_config.py 實(shí)現(xiàn)不同品牌 華三 華為 思科 銳捷 中興交換機(jī)的批量設(shè)置。

import csv
import logging
import sys
import threading
import os
from netmiko import ConnectHandler
from netmiko.exceptions import NetmikoTimeoutException, NetmikoAuthenticationException

# ---------- 1. 日志配置 ----------
logging.basicConfig(
    level=logging.INFO,
    format='%(asctime)s - %(threadName)s - %(message)s',
    handlers=[
        logging.FileHandler(r'c:\1\batch_result.log', encoding='utf-8'),
        logging.StreamHandler(sys.stdout)
    ]
)
logger = logging.getLogger(__name__)

# ---------- 2. 品牌 → 命令文件映射 ----------
# 每個(gè)品牌可以有多個(gè)別名(如中文、英文簡(jiǎn)稱)
COMMAND_FILE_MAP = {
    'h3c':    r'c:\1\config_commands_h3c.txt',
    'ruijie': r'c:\1\config_commands_ruijie.txt',
    '銳捷':    r'c:\1\config_commands_ruijie.txt',
    'zte':    r'c:\1\config_commands_zte.txt',
    '中興':    r'c:\1\config_commands_zte.txt',
    'huawei': r'c:\1\config_commands_huawei.txt',
    '華為':    r'c:\1\config_commands_huawei.txt',
    'cisco':  r'c:\1\config_commands_cisco.txt',
    '思科':    r'c:\1\config_commands_cisco.txt',
}
DEFAULT_COMMAND_FILE = r'c:\1\config_commands.txt'   # 未匹配品牌時(shí)使用的備用文件

# ---------- 3. 按品牌加載命令 ----------
def load_commands(vendor: str) -> list:
    """
    根據(jù)廠商品牌返回對(duì)應(yīng)的命令列表。
    優(yōu)先讀取品牌專屬文件,如果文件不存在或未配置映射則回退到默認(rèn)文件。
    """
    vendor_key = vendor.strip().lower()
    filepath = COMMAND_FILE_MAP.get(vendor_key, DEFAULT_COMMAND_FILE)

    if not os.path.exists(filepath):
        logger.warning(f"{vendor} 的命令文件 {filepath} 不存在,嘗試使用默認(rèn)文件")
        filepath = DEFAULT_COMMAND_FILE

    try:
        with open(filepath, 'r', encoding='utf-8') as f:
            commands = [line.strip() for line in f
                        if line.strip() and not line.strip().startswith('#')]
        if not commands:
            logger.warning(f"命令文件 {filepath} 內(nèi)容為空")
        return commands
    except Exception as e:
        logger.error(f"讀取命令文件 {filepath} 失敗: {e}")
        return []

# ---------- 4. 單臺(tái)設(shè)備配置函數(shù) ----------
def configure_device(ip, username, password, vendor, secret, results):
    # 根據(jù)廠商選擇 device_type
    vendor_lower = vendor.strip().lower()
    if vendor_lower == 'h3c':
        device_type = 'hp_comware'
    elif vendor_lower in ('ruijie', '銳捷'):
        device_type = 'ruijie_os'
    elif vendor_lower in ('zte', '中興'):
        device_type = 'zte_zxros'
    elif vendor_lower in ('huawei', '華為'):
        device_type = 'huawei'
    elif vendor_lower in ('cisco', '思科'):
        device_type = 'cisco_ios'
    else:
        logger.error(f"{ip}: 不支持的廠商 {vendor}")
        results['failed'].append((ip, f'不支持的廠商: {vendor}'))
        return

    # ---------- 關(guān)鍵:按品牌加載專屬命令 ----------
    commands = load_commands(vendor)
    if not commands:
        logger.error(f"{ip} ({vendor}): 配置命令為空,跳過該設(shè)備")
        results['failed'].append((ip, '無可用配置命令'))
        return

    # 構(gòu)建設(shè)備連接參數(shù)
    device = {
        'device_type': device_type,
        'ip': ip,
        'username': username,
        'password': password,
        'timeout': 30,
        'session_timeout': 60,
        'session_log': f'c:\\1\\{ip}_session.log',
    }
    if secret:
        device['secret'] = secret

    try:
        logger.info(f"正在連接 {ip} ({vendor})...")
        with ConnectHandler(**device) as conn:
            # 如果配置了 enable 密碼,則進(jìn)入特權(quán)模式
            if secret:
                conn.enable()
            output = conn.send_config_set(commands, exit_config_mode=False)
            # 保存配置(Netmiko 會(huì)根據(jù) device_type 自動(dòng)選擇合適的命令,如 save、write memory)
            conn.save_config()
            logger.info(f"? {ip} ({vendor}) 配置成功并保存")
            results['success'].append(ip)
    except NetmikoTimeoutException:
        logger.error(f"? {ip} ({vendor}) 連接超時(shí)")
        results['failed'].append((ip, '連接超時(shí)'))
    except NetmikoAuthenticationException:
        logger.error(f"? {ip} ({vendor}) 認(rèn)證失敗")
        results['failed'].append((ip, '認(rèn)證失敗'))
    except Exception as e:
        logger.error(f"? {ip} ({vendor}) 配置異常: {e}")
        results['failed'].append((ip, str(e)))

# ---------- 5. 主函數(shù) ----------
def main():
    # 讀取設(shè)備列表(CSV表頭:ip, username, password, vendor, secret)
    devices = []
    try:
        with open(r'c:\1\devices.csv', 'r', encoding='utf-8-sig') as f:
            reader = csv.DictReader(f)
            for row in reader:
                devices.append((
                    row['ip'].strip(),
                    row['username'].strip(),
                    row['password'].strip(),
                    row.get('vendor', 'h3c').strip(),  # 默認(rèn) H3C,其他品牌必須明確填寫
                    row.get('secret', '').strip()      # 無 enable 密碼時(shí)留空
                ))
    except Exception as e:
        logger.error(f"讀取設(shè)備列表失敗: {e}")
        return

    if not devices:
        logger.error("設(shè)備列表為空!")
        return

    logger.info(f"共加載 {len(devices)} 臺(tái)設(shè)備,開始批量配置...")

    results = {'success': [], 'failed': []}
    threads = []
    MAX_THREADS = 10

    for ip, user, pwd, vendor, secret in devices:
        t = threading.Thread(
            target=configure_device,
            args=(ip, user, pwd, vendor, secret, results),
            name=f"Thread-{ip}"
        )
        threads.append(t)
        t.start()

        # 控制并發(fā)數(shù)
        if len(threads) >= MAX_THREADS:
            for t in threads:
                t.join()
            threads = []

    for t in threads:
        t.join()

    logger.info("=" * 50)
    logger.info(f"配置完成!成功: {len(results['success'])} 臺(tái),失敗: {len(results['failed'])} 臺(tái)")
    if results['failed']:
        logger.error("失敗設(shè)備列表:")
        for ip, reason in results['failed']:
            logger.error(f"  {ip} - {reason}")

if __name__ == '__main__':
    main()

如下腳本為批量導(dǎo)出交換機(jī)配置,并保存為collect_switch_configs.py 所有文件位于C:\1 文件夾

import csv
import logging
import sys
import threading
import os
from netmiko import ConnectHandler
from netmiko.exceptions import NetmikoTimeoutException, NetmikoAuthenticationException

# ---------- 1. 日志配置 ----------
LOG_FILE = r'c:\1\collect_configs.log'
OUTPUT_DIR = r'c:\1\configs'          # 配置保存目錄

os.makedirs(OUTPUT_DIR, exist_ok=True)

logging.basicConfig(
    level=logging.INFO,
    format='%(asctime)s - %(threadName)s - %(message)s',
    handlers=[
        logging.FileHandler(LOG_FILE, encoding='utf-8'),
        logging.StreamHandler(sys.stdout)
    ]
)
logger = logging.getLogger(__name__)

# ---------- 2. 品牌 → 配置查看命令映射 ----------
SHOW_CONFIG_CMD = {
    'h3c':    'display current-configuration',
    'ruijie': 'show running-config',
    '銳捷':   'show running-config',
    'zte':    'show running-config',
    '中興':   'show running-config',
    'huawei': 'display current-configuration',
    '華為':   'display current-configuration',
    'cisco':  'show running-config',
    '思科':   'show running-config',
}
DEFAULT_CMD = 'show running-config'   # 無法匹配品牌時(shí)的備用命令

# ---------- 3. 單臺(tái)設(shè)備配置收集函數(shù) ----------
def collect_one_device(ip, username, password, vendor, secret, results):
    # 解析設(shè)備類型
    vendor_lower = vendor.strip().lower()
    if vendor_lower == 'h3c':
        device_type = 'hp_comware'
    elif vendor_lower in ('ruijie', '銳捷'):
        device_type = 'ruijie_os'
    elif vendor_lower in ('zte', '中興'):
        device_type = 'zte_zxros'
    elif vendor_lower in ('huawei', '華為'):
        device_type = 'huawei'
    elif vendor_lower in ('cisco', '思科'):
        device_type = 'cisco_ios'
    else:
        logger.error(f"{ip}: 不支持的廠商 {vendor}")
        results['failed'].append((ip, f'不支持的廠商: {vendor}'))
        return

    # 獲取該品牌對(duì)應(yīng)的配置查看命令
    cmd = SHOW_CONFIG_CMD.get(vendor_lower, DEFAULT_CMD)

    # 連接參數(shù)
    device = {
        'device_type': device_type,
        'ip': ip,
        'username': username,
        'password': password,
        'timeout': 30,
        'session_timeout': 60,
        'session_log': f'c:\\1\\{ip}_collect_session.log',  # 可選:保存會(huì)話日志
    }
    if secret:
        device['secret'] = secret

    try:
        logger.info(f"正在連接 {ip} ({vendor}) 并獲取配置...")
        with ConnectHandler(**device) as conn:
            if secret:
                conn.enable()      # 進(jìn)入特權(quán)模式(如果需要)
            # 執(zhí)行命令,獲取完整配置輸出
            config_output = conn.send_command(cmd, read_timeout=60)

            # 保存到本地文件
            filename = os.path.join(OUTPUT_DIR, f"{ip}_config.txt")
            with open(filename, 'w', encoding='utf-8') as f:
                f.write(config_output)

            logger.info(f"? {ip} ({vendor}) 配置已保存 -> {filename}")
            results['success'].append(ip)

    except NetmikoTimeoutException:
        logger.error(f"? {ip} ({vendor}) 連接超時(shí)")
        results['failed'].append((ip, '連接超時(shí)'))
    except NetmikoAuthenticationException:
        logger.error(f"? {ip} ({vendor}) 認(rèn)證失敗")
        results['failed'].append((ip, '認(rèn)證失敗'))
    except Exception as e:
        logger.error(f"? {ip} ({vendor}) 異常: {e}")
        results['failed'].append((ip, str(e)))

# ---------- 4. 主函數(shù) ----------
def main():
    # 讀取設(shè)備列表(CSV表頭:ip, username, password, vendor, secret)
    devices = []
    try:
        with open(r'c:\1\devices.csv', 'r', encoding='utf-8-sig') as f:
            reader = csv.DictReader(f)
            for row in reader:
                devices.append((
                    row['ip'].strip(),
                    row['username'].strip(),
                    row['password'].strip(),
                    row.get('vendor', 'h3c').strip(),
                    row.get('secret', '').strip()
                ))
    except Exception as e:
        logger.error(f"讀取設(shè)備列表失敗: {e}")
        return

    if not devices:
        logger.error("設(shè)備列表為空!")
        return

    logger.info(f"共加載 {len(devices)} 臺(tái)設(shè)備,開始批量收集配置...")

    results = {'success': [], 'failed': []}
    threads = []
    MAX_THREADS = 10

    for ip, user, pwd, vendor, secret in devices:
        t = threading.Thread(
            target=collect_one_device,
            args=(ip, user, pwd, vendor, secret, results),
            name=f"Thread-{ip}"
        )
        threads.append(t)
        t.start()

        if len(threads) >= MAX_THREADS:
            for t in threads:
                t.join()
            threads = []

    for t in threads:
        t.join()

    # 輸出匯總
    logger.info("=" * 50)
    logger.info(f"收集完成!成功: {len(results['success'])} 臺(tái),失敗: {len(results['failed'])} 臺(tái)")
    if results['failed']:
        logger.error("失敗設(shè)備列表:")
        for ip, reason in results['failed']:
            logger.error(f"  {ip} - {reason}")

if __name__ == '__main__':
    main()

最終目錄結(jié)構(gòu)如下:

devices.csv結(jié)構(gòu)如下:

實(shí)現(xiàn)的最終效果是:

運(yùn)行batch_config.py 并發(fā)(10并發(fā)默認(rèn))讀取devices.csv 按照設(shè)備品牌判斷,調(diào)用對(duì)應(yīng)腳本配置,并自動(dòng)保存配置過程日志;輸出配置成功多少臺(tái),配置錯(cuò)誤多少臺(tái)。

運(yùn)行collect_switch_configs.py 并發(fā)讀?。?0并發(fā)默認(rèn))讀取devices.csv 將配置文件按照管理IP地址命名 保存到configs文件夾。

到此這篇關(guān)于Python腳本實(shí)現(xiàn)批量修改交換機(jī)的文章就介紹到這了,更多相關(guān)Python修改交換機(jī)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Python手拉手教你爬取貝殼房源數(shù)據(jù)的實(shí)戰(zhàn)教程

    Python手拉手教你爬取貝殼房源數(shù)據(jù)的實(shí)戰(zhàn)教程

    隨著人工智能的不斷發(fā)展,機(jī)器學(xué)習(xí)這門技術(shù)也越來越重要,很多人都開啟了學(xué)習(xí)機(jī)器學(xué)習(xí),本文就介紹了機(jī)器學(xué)習(xí)的基礎(chǔ)內(nèi)容,了解python爬蟲,本文給大家分享Python爬取貝殼房源數(shù)據(jù)的實(shí)戰(zhàn)教程,感興趣的朋友一起學(xué)習(xí)吧
    2021-05-05
  • keras中的backend.clip用法

    keras中的backend.clip用法

    這篇文章主要介紹了keras中的backend.clip用法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2020-05-05
  • 關(guān)于Python中模塊的簡(jiǎn)介、定義與使用

    關(guān)于Python中模塊的簡(jiǎn)介、定義與使用

    這篇文章主要介紹了關(guān)于Python中模塊的簡(jiǎn)介、定義與使用,模塊是Python的重要組成部分,需要的朋友可以參考下
    2023-04-04
  • OpenCV簡(jiǎn)單標(biāo)準(zhǔn)數(shù)字識(shí)別的完整實(shí)例

    OpenCV簡(jiǎn)單標(biāo)準(zhǔn)數(shù)字識(shí)別的完整實(shí)例

    這篇文章主要給大家介紹了關(guān)于OpenCV簡(jiǎn)單標(biāo)準(zhǔn)數(shù)字識(shí)別的相關(guān)資料,要通過opencv 進(jìn)行數(shù)字識(shí)別離不開訓(xùn)練庫的支持,需要對(duì)目標(biāo)圖片進(jìn)行大量的訓(xùn)練,才能做到精準(zhǔn)的識(shí)別出目標(biāo)數(shù)字,需要的朋友可以參考下
    2021-09-09
  • pytorch 使用加載訓(xùn)練好的模型做inference

    pytorch 使用加載訓(xùn)練好的模型做inference

    今天小編就為大家分享一篇pytorch 使用加載訓(xùn)練好的模型做inference,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2020-02-02
  • python使用wmi模塊獲取windows下硬盤信息的方法

    python使用wmi模塊獲取windows下硬盤信息的方法

    這篇文章主要介紹了python使用wmi模塊獲取windows下硬盤信息的方法,涉及Python獲取系統(tǒng)硬件信息的相關(guān)技巧,需要的朋友可以參考下
    2015-05-05
  • Python+Selenium實(shí)現(xiàn)短視頻熱點(diǎn)爬取

    Python+Selenium實(shí)現(xiàn)短視頻熱點(diǎn)爬取

    隨著短視頻的大火,不僅可以給人們帶來娛樂,還有熱點(diǎn)新聞時(shí)事以及各種知識(shí),刷短視頻也逐漸成為了日常生活的一部分。本文將通過Pyhton依托Selenium來爬取短視頻熱點(diǎn),需要的可以參考一下
    2022-04-04
  • Python中操作MySQL和SQL Server數(shù)據(jù)庫的實(shí)戰(zhàn)指南

    Python中操作MySQL和SQL Server數(shù)據(jù)庫的實(shí)戰(zhàn)指南

    本文詳細(xì)介紹了如何在Pvthon中使用pymysql和pymssql庫進(jìn)行MySQL和SQLServer數(shù)據(jù)庫的基本操作,包括連接、查詢、插入、更新、異常處理、參數(shù)化查詢、ORM應(yīng)用、事務(wù)處理以及連接池的使用,為讀者提供了一套全面的數(shù)據(jù)庫操作指南,需要的朋友可以參考下
    2025-11-11
  • python 如何調(diào)用 dubbo 接口

    python 如何調(diào)用 dubbo 接口

    這篇文章主要介紹了python 如何調(diào)用 dubbo 接口,幫助大家更好的理解和學(xué)習(xí)python,感興趣的朋友可以了解下
    2020-09-09
  • Numpy中np.max的用法及np.maximum區(qū)別

    Numpy中np.max的用法及np.maximum區(qū)別

    這篇文章主要介紹了Numpy中np.max的用法及np.maximum區(qū)別,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-11-11

最新評(píng)論

紫云| 甘谷县| 肃宁县| 措美县| 永兴县| 腾冲县| 依安县| 丰城市| 新和县| 深水埗区| 克什克腾旗| 林周县| 秦安县| 屯留县| 龙门县| 神木县| 东台市| 芜湖县| 舒兰市| 临汾市| 西城区| 曲周县| 焉耆| 会同县| 禹州市| 肥东县| 红桥区| 石泉县| 湖北省| 柘荣县| 涞水县| 桂平市| 龙游县| 阿克苏市| 汽车| 都匀市| 永顺县| 兰溪市| 融水| 湖南省| 吴桥县|