You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python提取Cisco防火墙网络对象组成员并导出Excel的问题

解决Cisco网络对象组提取并导出Excel的问题

嘿,我刚好有过处理Cisco配置导出的经验,这个问题其实核心就是精准划分每个对象组的边界,不用搞复杂的行计数,用「状态跟踪」的方式就能完美解决!

核心思路

我们可以逐行读取配置文件,同时维护两个状态变量:

  • 当前正在处理的对象组名称
  • 当前组的成员列表

遇到新的object-group network行时,先把上一个组的完整数据保存下来,再初始化新的组;遇到network-object行时,就把成员信息加入当前组的列表。最后把所有组的数据逐行写入Excel即可。

完整代码实现

我用Python结合openpyxl库来完成这个需求,代码里加了详细注释,方便你理解:

from openpyxl import Workbook

def parse_object_groups(config_path):
    object_groups = []
    current_group = None
    current_members = []

    with open(config_path, 'r', encoding='utf-8') as f:
        for line in f:
            line = line.strip()
            # 跳过空行和注释行(如果配置里有#开头的注释)
            if not line or line.startswith('#'):
                continue

            # 检测到新的网络对象组
            if line.startswith('object-group network'):
                # 先把上一个组的数据保存(如果存在)
                if current_group is not None:
                    object_groups.append([current_group] + current_members)
                # 初始化新的组
                current_group = line
                current_members = []
            # 处理组内的网络成员
            elif line.startswith('network-object'):
                if current_group is not None:
                    # 拆分行内容,兼容两种成员格式:host单IP和子网
                    parts = line.split(maxsplit=2)
                    if len(parts) == 3:
                        # 子网格式:network-object x.x.x.x x.x.x.x,直接取两个IP段
                        current_members.extend([parts[1], parts[2]])
                    elif parts[1] == 'host':
                        # Host格式:network-object host a.a.a.a,只取后面的IP
                        current_members.append(parts[2])
        # 循环结束后,别忘了保存最后一个组(避免遗漏)
        if current_group is not None:
            object_groups.append([current_group] + current_members)
    
    return object_groups

def write_to_excel(object_groups, excel_path):
    wb = Workbook()
    ws = wb.active
    ws.title = "Network Object Groups"

    # 逐行写入每个对象组的数据
    for row_data in object_groups:
        ws.append(row_data)
    
    # 自动调整列宽,让表格更美观易读
    for col in ws.columns:
        max_length = 0
        column_letter = col[0].column_letter
        for cell in col:
            try:
                if len(str(cell.value)) > max_length:
                    max_length = len(str(cell.value))
            except:
                pass
        ws.column_dimensions[column_letter].width = (max_length + 2) * 1.2
    
    wb.save(excel_path)

if __name__ == "__main__":
    # 替换成你的配置文件路径和输出Excel路径
    config_file = "cisco_firewall_config.txt"
    excel_output = "network_object_groups.xlsx"
    
    groups_data = parse_object_groups(config_file)
    write_to_excel(groups_data, excel_output)
    print(f"搞定!数据已经导出到 {excel_output}")

关键细节说明

  1. 状态跟踪逻辑:通过current_group和current_members确保每个成员都归属到正确的组,完全不会出现跨组混淆的问题
  2. 兼容两种成员格式:自动识别host单IP和子网格式,把IP信息正确提取并加入成员列表
  3. 收尾处理:循环结束后必须保存最后一个组,不然会漏掉最后一组数据
  4. Excel优化:额外加了列宽自动调整的逻辑,导出的表格不用手动拉宽列就能看清内容

扩展提示

  • 如果你的配置里有其他类型的对象组(比如object-group service),只需要修改startswith的判断条件即可适配
  • 如果需要给Excel加表头,可以在write_to_excel函数里先写入一行表头数据(比如ws.append(["对象组名称", "成员1", "成员2", ...]))

内容的提问来源于stack exchange,提问作者Feng

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 08:09:00