目录

一、实验拓扑

二、实验目的

三、实验步骤

实验思路:

代码部分:

四、实验结果:


一、实验拓扑

二、实验目的

利用python脚本,在本地,或者虚拟机里实现,设备CRC数量统计,并输出成表格

三、实验步骤

实验开始之前先搭好环境,测试无误再开始

实验思路:

利用ip.txt,存放需要检查的设备IP

再一台一台登录,匹配并记录接口名,和CRC数量,最终再输出保存

代码部分:

#!/usr/bin/env python3# -*- coding: utf-8 -*-import argparseimport osimport reimport timeimport socketimport getpassimport paramikoimport pandas as pdfrom paramiko import SSHException, AuthenticationExceptionDEFAULT_IP_FILE = 'ip.txt'DEFAULT_OUTPUT = 'crc_results.xlsx'DEFAULT_COMMAND = 'dis interface'DEFAULT_CONNECT_TIMEOUT = 5DEFAULT_CMD_TIMEOUT = 30MORE_PROMPTS = [b'--More--', b'---- More ----', b'--More--', b'More:', b'== More ==', b'--More--', b'\x1b\[K--More--']def read_ip_list(path):ips = []if not os.path.exists(path):print(f"[!] IP file not found: {path}")return ipswith open(path, 'r', encoding='utf-8') as f:for raw in f:line = raw.strip()if not line:continueif line.startswith('#'):continueparts = re.split(r'[\s,]+', line)if parts and parts[0]:ips.append(parts[0])return ipsdef recv_with_paging(shell, timeout=DEFAULT_CMD_TIMEOUT):"""从交互 shell 中读取输出,自动处理分页(遇到 --More-- 等发送空格继续)。返回解码后的文本。"""buf = b''start = time.time()last_recv = time.time()shell.settimeout(1.0)while True:try:if shell.recv_ready():chunk = shell.recv(65536)if not chunk:breakbuf += chunklast_recv = time.time()# 检查是否包含常见分页提示(原始字节)for mp in MORE_PROMPTS:if mp in chunk:try:shell.send(' ')except Exception:pass# 也处理常见 ASCII 控制字符后跟 More 文本(部分设备会带 escape)# 继续循环读取else:time.sleep(0.1)except socket.timeout:# no data right nowpassexcept Exception:# 其他异常则跳出breakif (time.time() - start) > timeout:break# 当已有数据并且很久没读到新数据,认为输出结束if buf and (time.time() - last_recv) > 1.2:breaktry:return buf.decode(errors='ignore')except:return buf.decode('utf-8', 'ignore')def run_command_interactive(client, command, cmd_timeout=DEFAULT_CMD_TIMEOUT):shell = client.invoke_shell()time.sleep(0.2)# 尝试关闭分页# 兼容多厂商:terminal length 0, screen-length disable, page-off 等try:shell.send('terminal length 0\n')time.sleep(0.15)shell.send('screen-length 0 temporary\n')time.sleep(0.15)shell.send('page off\n')time.sleep(0.15)except Exception:pass# 清空 bannertry:if shell.recv_ready():_ = shell.recv(65536)except Exception:pass# 发送命令并读取,自动处理分页try:shell.send(command + '\n')except Exception:passoutput = recv_with_paging(shell, timeout=cmd_timeout)try:shell.close()except Exception:passreturn outputdef split_interface_blocks(output):"""更严格的 H3C 专用分割:- 识别常见 H3C 前缀:GigabitEthernet, Ethernet, Ten-GigabitEthernet, Eth-Trunk,Vlan-interface / Vlanif, Loopback, FortyGigabitEthernet 等。- 要求接口名包含数字,避免把 'Flow-control' 等字段当接口头。返回列表 (iface_name, block_text)"""lines = output.splitlines()blocks = []cur_iface = Nonecur_lines = []# 列出常见的接口前缀(可按需扩展)iface_prefixes = [r'GigabitEthernet', r'GigEth', r'Ten-GigabitEthernet', r'FortyGigabitEthernet',r'Ethernet', r'Eth-Trunk', r'Vlan-interface', r'Vlanif', r'Loopback', r'VEth', r'Veth']prefix_pat = r'(' + '|'.join(iface_prefixes) + r')'# 可能的 header 样式:# "GigabitEthernet1/0/1 current state : UP"# "Interface: GigabitEthernet1/0/1"# "GigabitEthernet1/0/1 is down"p1 = re.compile(r'^\s*(?:Interface[:\s]+)?' + prefix_pat + r'([A-Za-z0-9\/\-\._]*\d+)\b', re.IGNORECASE)# 另一种:全名连续(例如 "GigabitEthernet1/0/1 current state : UP")p2 = re.compile(r'^\s*' + prefix_pat + r'([A-Za-z0-9\/\-\._]*\d+)\b.*(?:current state|is up|is down|UP|DOWN|administratively down)', re.IGNORECASE)for ln in lines:ln_str = ln.rstrip('\r\n')m = Nonefor p in (p1, p2):mm = p.match(ln_str)if mm:# 名字由 mm.group(1)+group(2) 或 mm.group(1)+group(2) 组成,取匹配到的完整接口名# 某些 pattern 捕获了两部分(前缀和后缀),拼接起来groups = [g for g in mm.groups() if g]name = ''.join(groups).strip()# 最终再确认包含数字if not re.search(r'\d', name):continuem = namebreakif m:name = m.rstrip(',:')if cur_iface is not None:blocks.append((cur_iface, '\n'.join(cur_lines)))cur_iface = namecur_lines = [ln_str]else:if cur_iface is not None:cur_lines.append(ln_str)else:cur_lines.append(ln_str)if cur_iface is not None:blocks.append((cur_iface, '\n'.join(cur_lines)))else:blocks = [('Unknown', '\n'.join(cur_lines).strip())] if cur_lines else [('Unknown', output.strip())]return blocksdef extract_crc_from_block(block_text):"""多种方式提取 CRC 数字:- '4 input errors, 2 CRC, 0 frame' -> 2- 'CRC: 2' or 'CRC 2' or '2 CRC' -> 2- 'input errors: 2, CRC: 2' etc.返回整数(若能解析)或 None。"""# 常见组合patterns = [re.compile(r'(\d+)\s+input errors.*?(\d+)\s+CRC', re.IGNORECASE | re.DOTALL),re.compile(r'input errors[:\s]*\d+[,;\s]*CRC[:\s]*(\d+)', re.IGNORECASE),re.compile(r'CRC[:\s]+(\d+)', re.IGNORECASE),re.compile(r'\b(\d+)\s+CRC\b', re.IGNORECASE),re.compile(r'CRC errors[:\s]*(\d+)', re.IGNORECASE),re.compile(r'CRC\s+(\d+)', re.IGNORECASE)]for rg in patterns:m = rg.search(block_text)if m:# 找最后一组数字(某些 pattern 有两个捕获组)for g in reversed(m.groups()):if g and g.isdigit():try:return int(g)except:pass# 如果找不到数字,但出现单词 CRC,则标记为 Unknown (存在 CRC 词但无数字)if re.search(r'\bCRC\b', block_text, re.IGNORECASE):return None  # Unknown count but CRC mentioned# 否则认为没有 CRC(记录为 0)return 0def check_one_device(ip, username, password, command, connect_timeout, cmd_timeout):client = paramiko.SSHClient()client.set_missing_host_key_policy(paramiko.AutoAddPolicy())try:client.connect(hostname=ip,username=username,password=password,timeout=connect_timeout,banner_timeout=connect_timeout,auth_timeout=connect_timeout)except AuthenticationException as e:return False, f'Authentication failed: {e}'except socket.timeout:return False, 'Connection timed out'except SSHException as e:return False, f'SSHException: {e}'except Exception as e:return False, f'Connection failed: {e}'try:output = run_command_interactive(client, command, cmd_timeout=cmd_timeout)except Exception as e:try:client.close()except:passreturn False, f'Failed to run command: {e}'try:client.close()except:passif not output:return True, []  # 没有输出也返回成功但没有接口blocks = split_interface_blocks(output)results = []for iface, block in blocks:crc_val = extract_crc_from_block(block)# 规范输出值:数字 -> string of number; None -> 'Unknown'; 0 -> '0'if crc_val is None:crc_str = 'Unknown'else:crc_str = str(int(crc_val))results.append({'interface': iface, 'crc': crc_str})return True, resultsdef main():parser = argparse.ArgumentParser(description='Check interfaces CRC on devices listed in ip.txt')parser.add_argument('-i', '--ipfile', default=os.environ.get('IP_FILE', DEFAULT_IP_FILE), help='IP list file (default ip.txt)')parser.add_argument('-u', '--username', help='SSH username (or set SSH_USER env)')parser.add_argument('-p', '--password', help='SSH password (or set SSH_PASS env) - warning: visible in process list')parser.add_argument('-c', '--command', default=os.environ.get('CRC_CMD', DEFAULT_COMMAND), help=f'Command to run on device (default: "{DEFAULT_COMMAND}")')parser.add_argument('-o', '--output', default=DEFAULT_OUTPUT, help='Output Excel filename')parser.add_argument('--connect-timeout', type=int, default=int(os.environ.get('SSH_CONNECT_TIMEOUT', DEFAULT_CONNECT_TIMEOUT)), help='SSH connect timeout seconds (default 5)')parser.add_argument('--cmd-timeout', type=int, default=int(os.environ.get('SSH_CMD_TIMEOUT', DEFAULT_CMD_TIMEOUT)), help='Command read timeout seconds (default 30)')args = parser.parse_args()ips = read_ip_list(args.ipfile)if not ips:print(f'[!] No IPs found in {args.ipfile}')returnusername = args.username or os.environ.get('SSH_USER') or input('SSH username: ')password = args.password or os.environ.get('SSH_PASS') or getpass.getpass('SSH password: ')all_rows = []failures = []print(f'[+] Loaded {len(ips)} IPs, connecting with timeout {args.connect_timeout}s, command timeout {args.cmd_timeout}s')for ip in ips:print(f'[{ip}] connecting...')success, data = check_one_device(ip, username, password, args.command, args.connect_timeout, args.cmd_timeout)if not success:print(f'[{ip}] FAILED: {data}')failures.append({'ip': ip, 'reason': data})continueparsed = dataif not parsed:print(f'[{ip}] OK, but no interface blocks parsed.')# still add a row to indicate device had no data? We skip adding rows for this device (user requested only IP/interface/crc)continueprint(f'[{ip}] OK, {len(parsed)} interfaces parsed.')for ent in parsed:all_rows.append({'ip': ip, 'interface': ent['interface'], 'crc': ent['crc']})# 写 Excel:只包含 ip, interface, crc;另一个 sheet 记录失败df = pd.DataFrame(all_rows, columns=['ip', 'interface', 'crc'])df_fail = pd.DataFrame(failures, columns=['ip', 'reason'])with pd.ExcelWriter(args.output, engine='openpyxl') as writer:df.to_excel(writer, sheet_name='crc_results', index=False)df_fail.to_excel(writer, sheet_name='ssh_failures', index=False)print(f'[+] Done. Results saved to {args.output}')print(f'[+] Devices checked: {len(ips)}, interfaces rows: {len(all_rows)}, ssh failures: {len(failures)}')if __name__ == '__main__':main()

四、实验结果:

建议在终端运行,pycharm运行,getpass会卡住

最终生成excel表:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/web/92886.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/92886.shtml
英文地址,请注明出处:http://en.pswp.cn/web/92886.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Wed前端第二次作业

一、作业1&#xff1a;完成自己学校的官网&#xff0c;动忘内容直接贴&#xff0c;至少三个不同的页面1、界面1&#xff08;1&#xff09;相关代码<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name&quo…

第5节 大模型分布式推理通信优化与硬件协同

前言 在分布式推理中,多设备(如GPU、CPU)之间的数据传输(通信)是连接计算的“桥梁”。如果通信效率低下,即使单设备计算能力再强,整体性能也会大打折扣。想象一下:如果工厂之间的物流卡车跑得比生产速度还慢,再多的工厂也无法提高整体产量。 本节将从最基础的单设备内…

XGBoost 的适用场景以及与 CNN、LSTM 的区别

XGBoost 的核心优势与适用场景XGBoost 是一种梯度提升决策树算法&#xff0c;属于集成学习方法。它在处理结构化/表格化数据方面表现极其出色&#xff0c;是 Kaggle 竞赛和工业界广泛应用的“冠军”模型。其核心优势和应用场景包括&#xff1a;1. 结构化/表格化数据数据形式&a…

快速设计简单嵌入式操作系统(3):动手实操,基于STC8编写单任务执行程序,感悟MCU指令的执行过程

引言 前面我们陆续学习了操作系统常见的基础概念&#xff0c;接着简单了解了一下8051单片机的内存结构和执行顺序切换的相关概念。接下来&#xff0c;我们就开始进行实操&#xff0c;基于8051单片机STC8来编写一个简单的操作系统&#xff0c;这里我们先实现一个单任务的执行程…

Spring AI Alibaba - 聊天机器人快速上手

本节对应 Github&#xff1a;https://github.com/JCodeNest/JCodeNest-AI-Alibaba/tree/master/spring-ai-alibaba-helloworld 本文将以阿里巴巴的通义大模型为例&#xff0c;通过 Spring AI Alibaba 组件&#xff0c;手把手带你完成从零到一的构建过程&#xff1a;首先&#…

串口通信学习

不需要校验位就选8位&#xff0c;需要校验位就选9位&#xff01;USRTUSART框图STM32的外设引脚这是USART的基本结构。数据帧&#xff0c;八位是这个公式还是很重要的&#xff01;如果在编辑器里面使用printf打印汉字的话&#xff0c;会出现乱码的话&#xff0c;前提是你的编码格…

面试经典150题[001]:合并两个有序数组(LeetCode 88)

合并两个有序数组&#xff08;LeetCode 88&#xff09; https://leetcode.cn/problems/merge-sorted-array/?envTypestudy-plan-v2&envIdtop-interview-150 1. 题目背景 你有两个已经排好序的数组&#xff1a; nums1&#xff1a;前面是有效数字&#xff0c;后面是空位&…

快速安装达梦8测试库

计划&#xff1a;数据库名实例名PORT_NUMMAL_INST_DW_PORTMAL_HOSTMAL_PORTMAL_DW_PORTDMDWDBINST_1533615101192.168.207.612510135101*****[2025-08-11 15:14:34]***** Last login: Fri Jul 25 17:36:04 2025 from 192.168.88.48 [rootdm01 ~]# ip a 1: lo: <LOOPBACK,UP,…

Hive中优化问题

一、小文件合并优化Hive中的小文件分为Map端的小文件和Reduce端的小文件。(1)、Map端的小文件优化是通过CombineHiveInputFormat操作。相关的参数是&#xff1a;set hive.input.formatorg.apache.hadoop.hive.ql.io.CombineHiveInputFormat;(2)、Reduce端的小文件合并Map端的小…

tlias智能学习辅助系统--Maven高级-继承

目录 一、打包方式与应用场景 二、父子工程继承关系 1. 父工程配置 2. 子工程配置 三、自定义属性与引用属性 1. 定义属性 2. 在 dependencyManagement 中引用 3. 子工程中引用 四、dependencyManagement 与 dependencies 的区别 五、项目结构示例 六、小结 在实际开…

把 AI 押进“小黑屋”——基于 LLM 的隐私对话沙盒设计与落地

标签&#xff1a;隐私计算、可信执行环境、LLM、沙盒、内存加密、TEE、SGX、Gramine ---- 1. 背景&#xff1a;甲方爸爸一句话&#xff0c;“数据不能出机房” 我们给某三甲医院做智能问诊助手&#xff0c;模型 70 B、知识库 300 GB。 甲方只给了两条铁律&#xff1a; 1. 患者…

Java 大视界 -- Java 大数据在智能教育学习效果评估指标体系构建与精准评估中的应用(394)

Java 大视界 -- Java 大数据在智能教育学习效果评估指标体系构建与精准评估中的应用&#xff08;394&#xff09;引言&#xff1a;正文&#xff1a;一、传统学习评估的 “数字陷阱”&#xff1a;看不全、说不清、跟不上1.1 评估维度的 “单行道”1.1.1 分数掩盖的 “学习真相”…

Dubbo 3.x源码(33)—Dubbo Consumer接收服务调用响应

基于Dubbo 3.1&#xff0c;详细介绍了Dubbo Consumer接收服务调用响应 此前我们学习了Dubbo Provider处理服务调用请求的流程&#xff0c;现在我们来学习Dubbo Consumer接收服务调用响应流程。 实际上接收请求和接收响应同属于接收消息&#xff0c;它们的流程的很多步骤是一样…

栈和队列:数据结构中的基础与应用​

栈和队列&#xff1a;数据结构中的基础与应用在计算机科学的领域中&#xff0c;数据结构犹如大厦的基石&#xff0c;支撑着各类复杂软件系统的构建。而栈和队列作为两种基础且重要的数据结构&#xff0c;以其独特的特性和广泛的应用&#xff0c;在程序设计的舞台上扮演着不可或…

服务端配置 CORS解决跨域问题的原理

服务端配置 CORS&#xff08;跨域资源共享&#xff09;的原理本质是 浏览器与服务器之间的安全协商机制。其核心在于服务器通过特定的 HTTP 响应头声明允许哪些外部源&#xff08;Origin&#xff09;访问资源&#xff0c;浏览器根据这些响应头决定是否放行跨域请求。以下是详细…

Unity笔记(五)知识补充——场景切换、退出游戏、鼠标隐藏锁定、随机数、委托

写在前面&#xff1a;写本系列(自用)的目的是回顾已经学过的知识、记录新学习的知识或是记录心得理解&#xff0c;方便自己以后快速复习&#xff0c;减少遗忘。主要是C#代码部分。十七、场景切换和退出游戏1、场景切换场景切换使用方法&#xff1a; SceneManager.LoadScene()&a…

用 Spring 思维快速上手 DDD——以 Kratos 为例的分层解读

用 Spring 思维理解 DDD —— 以 Kratos 为参照 ​ 在此前的学习工作中&#xff0c;使用的开发框架一直都是 SpringBoot&#xff0c;对 MVC 架构几乎是肌肉记忆&#xff1a;Controller 接请求&#xff0c;Service 写业务逻辑&#xff0c;Mapper 操作数据库&#xff0c;这套套路…

docspace|Linux|使用docker完全离线化部署onlyoffice之docspace文档协作系统(全网首发)

一、 前言 书接上回&#xff0c;Linux|实用工具|onlyoffice workspace使用docker快速部署&#xff08;离线和定制化部署&#xff09;-CSDN博客&#xff0c;如果是小公司或者比如某个项目组内部使用&#xff0c;那么&#xff0c;使用docspace这个文档协同系统是非常合适的&…

【教程】如何高效提取胡萝卜块根形态和颜色特征?

胡萝卜是全球不可或缺的健康食材和重要的经济作物&#xff0c; 从田间到餐桌&#xff0c;从鲜食到深加工&#xff0c;胡萝卜在现代人的饮食和健康中扮演着极其重要的角色&#xff0c;通过量化块根形态和色泽均匀性&#xff0c;可实现对高产优质胡萝卜品种的快速筛选。工具/材料…

Python初学者笔记第二十四期 -- (面向对象编程)

第33节课 面向对象编程 1. 面向对象编程基础 1.1 什么是面向对象编程面向过程&#xff1a;执行者 耗时 费力 结果也不一定完美 面向对象&#xff1a;指挥者 省时 省力 结果比较完美面向对象编程(Object-Oriented Programming, OOP)是一种编程范式&#xff0c;它使用"对象&…