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}")
关键细节说明
- 状态跟踪逻辑:通过
current_group和current_members确保每个成员都归属到正确的组,完全不会出现跨组混淆的问题 - 兼容两种成员格式:自动识别
host单IP和子网格式,把IP信息正确提取并加入成员列表 - 收尾处理:循环结束后必须保存最后一个组,不然会漏掉最后一组数据
- Excel优化:额外加了列宽自动调整的逻辑,导出的表格不用手动拉宽列就能看清内容
扩展提示
- 如果你的配置里有其他类型的对象组(比如
object-group service),只需要修改startswith的判断条件即可适配 - 如果需要给Excel加表头,可以在
write_to_excel函数里先写入一行表头数据(比如ws.append(["对象组名称", "成员1", "成员2", ...]))
内容的提问来源于stack exchange,提问作者Feng
相关产品推荐
相关产品推荐

