90DaysOfDevOps 网络自动化实战(Day 27):用 Python + Netmiko/Paramiko 批量采集、配置与备份网络设备
文档/教程【免费下载链接】90DaysOfDevOpsThis repository started out as a learning in public project for myself and has now become a structured learning map for many in the community. We have 3 years under our belt covering all things DevOps, including Principles, Processes, Tooling and Use Cases surrounding this vast topic.项目地址https://gitcode.com/gh_mirrors/90/90DaysOfDevOps点击查看免费下载导读本文是 #90DaysOfDevOps 计算机网络系列的最后一天实战篇承接 Day 26 在 EVE-NG 中搭建的「1 台 Cisco vIOS 路由器 4 台 Cisco vIOS 交换机」仿真 lab聚焦用 Python 对网络设备做自动化。读完本文你将掌握通过 SSH 批量采集多台设备接口信息、自动下发配置如 trunk 配置、自动备份设备配置并理解 Paramiko 与 Netmiko 这两大 Python SSH 库的定位差异与典型用法。文中所有脚本都来自仓库 2022/Days/Networking 目录可直接对照学习。一、环境回顾与前置准备1.1 上一讲的 Lab 拓扑与地址表Day 26 在 EVE-NG 中创建了 5 台设备1 台 Cisco vIOS 路由器R1充当网关4 台 Cisco vIOS 二层交换机SW1~SW4互联。每台设备在仿真内网10.10.88.0/24中的管理地址如下Node仿真内网 IPRouter10.10.88.110Switch110.10.88.111Switch210.10.88.112Switch310.10.88.113Switch410.10.88.114各设备的初始配置脚本保存在仓库 2022/Days/Networking 下R1、SW1、SW2、SW3、SW4内容均开启 SSHip ssh version 2、启用本地认证username admin password access123、设置 enable 密码enable password access123并开启 LLDP 与 SNMP为后续自动化通信做好了准备。1.2 让设备接入宿主机的管理网络Management Cloud自动化脚本要从宿主机直接访问这些设备因此需要让仿真拓扑与宿主机网络打通。操作如下在 EVE-NG 拓扑画布上右键 → Network → 选择 Management(Cloud0)这会在拓扑中创建一个连接到宿主机的新网络对应本讲 Day27_Networking3.png 右侧云图标所表示的 Home Network。依次进入每台设备在其连接该 Management 网络的接口gi0/0上执行以下命令让该接口通过 DHCP 从宿主机网络自动获取 IPenable config t int gi0/0 IP add DHCP no sh exit exit sh ip int br执行完成后每台设备除了仿真内网地址外还会获得一个 Home Network 段的地址用于宿主机 SSH 访问Node仿真内网 IPHome Network IPRouter10.10.88.110192.168.169.115Switch110.10.88.111192.168.169.178Switch210.10.88.112192.168.169.193Switch310.10.88.113192.168.169.125Switch410.10.88.114192.168.169.197提示如果网络经验有限也可以先把 Router 与各 Switch 连好再由 Router 作为网关连通外部网络本讲按「每台设备直接接入 Management(Cloud0)」的方式演示逻辑最直观。1.3 从宿主机 SSH 验证连通性拿到地址后即可用任意 SSH 客户端如 Windows 上的 Putty从宿主机连接设备。本讲以 Putty 为例通过 192.168.169.115 连接 R1登录后即可进入 Cisco IOS 命令行。二、方案一Paramiko —— 通用 SSH 库2.1 什么是 ParamikoParamiko 是 Python 生态中最广泛使用的原生 SSH 实现之一它实现了 SSHv2 协议提供客户端连接、通道channel、密钥交换、SFTP 等能力不依赖任何外部 SSH 程序适合对任意支持 SSH 的主机做底层交互。安装只需一行命令pip install paramiko安装后可以在 Python 交互环境中验证导入是否成功import paramiko2.2 用 Paramiko 采集设备信息仓库中的 paramiko_show.py 演示了 Paramiko 的典型用法建立 SSH 客户端、自动接受主机密钥、登录后打开交互式 shell 通道逐条发送命令并接收输出#!/usr/bin/python import paramiko import time Channel paramiko.SSHClient() Channel.set_missing_host_key_policy(paramiko.AutoAddPolicy()) Channel.connect(hostname192.168.169.115, usernameadmin, passwordaccess123, look_for_keysFalse, allow_agentFalse) shell Channel.invoke_shell() # This will set interactive shell shell.send(enable\n) shell.send(access123\n) shell.send(terminal length 0\n) shell.send(show ip int b\n) shell.send(show arp \n) time.sleep(2) print(shell.recv(5000)) # 需要精确获取某条命令输出时应先发送命令并立即读取再发下一条两条命令之间建议加一点 sleep Channel.close()关键点解读set_missing_host_key_policy(paramiko.AutoAddPolicy())自动接受未在 known_hosts 中出现过的主机公钥实验环境用很方便invoke_shell()创建交互式伪终端通道可以像人坐在 console 前一样连续发送命令、处理enable密码等状态变化look_for_keysFalse, allow_agentFalse明确不使用本机密钥与 ssh-agent而是用脚本内给定的用户名密码登录由于通道是交互式的命令输出是异步返回的因此发送命令后要time.sleep()等待再recv()读取缓冲区。三、方案二Netmiko —— 面向网络设备的封装库3.1 Netmiko 与 Paramiko 的分工Paramiko 是通用 SSH 库而Netmiko 专门面向网络设备在 Paramiko 之上封装了对 Cisco、Juniper、Arista、华为、H3C 等众多厂商设备的适配层自动处理各厂商特有的登录提示、分页符--More--、enable/特权模式、命令回显等差异让脚本只需写设备类型与命令本身。安装命令pip install netmikoNetmiko 对厂商设备的支持列表可在其官方仓库的 Supports 章节查阅。3.2 用 Netmiko 批量采集多台设备接口信息仓库 netmiko_con_multi.py 是「一次运行、连接全部设备」的示例把每台设备抽象成一个 Python 字典device_type、host、username、password循环建立连接、发送命令、打印输出#!/usr/bin/env python from netmiko import ConnectHandler from getpass import getpass # password getpass() R1 { device_type: cisco_ios, host: 192.168.169.115, username: admin, password: access123, } SW1 { device_type: cisco_ios, host: 192.168.169.178, username: admin, password: access123, } SW2 { device_type: cisco_ios, host: 192.168.169.193, username: admin, password: access123, } SW3 { device_type: cisco_ios, host: 192.168.169.125, username: admin, password: access123, } SW4 { device_type: cisco_ios, host: 192.168.169.197, username: admin, password: access123, } command show ip int brief for device in (R1, SW1, SW2, SW3, SW4): net_connect ConnectHandler(**device) print(net_connect.find_prompt()) print(net_connect.send_command(command)) net_connect.disconnect()运行后会依次打印 R1、SW1~SW4 的设备提示符如R1#以及show ip int brief的接口汇总接口名、IP、OK 状态、获取方式、接口状态、协议状态。脚本开头保留了getpass()的注释写法生产环境更推荐用交互式输入密码避免把口令硬编码进脚本。find_prompt()返回当前设备提示符用于确认已登录并处于正确模式send_command(command)发送一条 show 命令并等待完整输出返回Netmiko 会自动处理分页disconnect()断开连接释放资源。如果设备数量很多这种「设备字典 循环」模式可以让你集中管理、一次运行查看所有配置非常利于快速巡检。四、用 Python 下发配置trunk 自动化4.1 场景批量把端口配置为 trunk上一讲提到 SW1 与 SW2 之间有一条 trunk 链路。若手动逐台 SSH 配置既慢又易错自动化则可以一条脚本同时改多台交换机。仓库 netmiko_sendchange.py 演示了向 SW2 下发一组 trunk 配置from netmiko import ConnectHandler SW2 { device_type: cisco_ios, host: 192.168.169.193, username: admin, password: access123, secret: access123, } core_sw_config [int range gig0/1 - 2, switchport trunk encapsulation dot1q, switchport mode trunk, switchport trunk allowed vlan 1,2] print(########## Connecting to Device {0} ############.format(SW2)) net_connect ConnectHandler(**SW2) net_connect.enable() print(***** Sending Configuration to Device *****) net_connect.send_config_set(core_sw_config)要点连接字典中多了secret字段这是 enable/特权模式的密码配合net_connect.enable()进入特权模式真实设备上请使用与enable password一致的密码send_config_set([...])接收一个配置命令列表Netmiko 会依次进入配置模式、逐条下发、再退出一条脚本即可完成成组配置配置命令int range gig0/1 - 2进入一组接口→switchport trunk encapsulation dot1qtrunk 封装→switchport mode trunktrunk 模式→switchport trunk allowed vlan 1,2允许 VLAN 1 与 2 通过。注意脚本打印了sending configuration to device字样但这只是「正在发送」的提示并不代表配置已生效。生产使用时应补充验证环节。4.2 验证配置结果批量查询 trunk 状态为确认配置真实生效可复用「设备字典 循环」模式把命令换成show int trunk。仓库 netmiko_con_multi_vlan.py 正是这样做的——遍历 SW1~SW4 执行show int trunk输出每台交换机 Trunk 口的模式、封装、状态、本征 VLAN、允许通过的 VLAN 以及生成树中处于转发状态未阻塞的 VLAN用于核验配置是否成功下发#!/usr/bin/env python from netmiko import ConnectHandler from getpass import getpass # password getpass() SW1 { device_type: cisco_ios, host: 192.168.169.178, username: admin, password: access123, } SW2 { device_type: cisco_ios, host: 192.168.169.193, username: admin, password: access123, } SW3 { device_type: cisco_ios, host: 192.168.169.125, username: admin, password: access123, } SW4 { device_type: cisco_ios, host: 192.168.169.197, username: admin, password: access123, } command show int trunk for device in (SW1, SW2, SW3, SW4): net_connect ConnectHandler(**device) print(net_connect.find_prompt()) print(net_connect.send_command(command)) net_connect.disconnect()这样「下发配置 → 批量验证」两段式流程构成了网络自动化最基础的闭环先改、再查、确保生效。五、用 Python 备份设备配置除了采集与配置配置备份也是网络运维的高频需求。仓库 backup.py 用 Paramiko 实现了一个可运行的备份脚本从文本文件读取目标 IP 列表逐台 SSH 登录、进入 enable、执行show run把回显落盘为带时间戳的文件并打印耗时统计import sys import time import paramiko import os import cmd import datetime now datetime.datetime.now() dt_string now.strftime(%d/%m/%Y %H:%M:%S) print(Your backup has started at, dt_string) tic time.perf_counter() # user input(Enter username:) # password input(Enter Paswd:) # enable_password input(Enter enable pswd:) user admin password access123 enable_password access123 port 22 f0 open(backup.txt) for ip in f0.readlines(): ip ip.strip() filename_prefix /Users/shambhu/Documents ip ssh paramiko.SSHClient() ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) ssh.connect(ip, port, user, password, look_for_keysFalse) chan ssh.invoke_shell() time.sleep(2) chan.send(enable\n) chan.send(enable_password \n) time.sleep(1) chan.send(term len 0\n) time.sleep(1) chan.send(sh run\n) time.sleep(20) output chan.recv(999999) filename %s_%.2i%.2i%i_%.2i%.2i%.2i % (ip, now.year, now.month, now.day, now.hour, now.minute, now.second) f1 open(filename, a) f1.write(output.decode(utf-8)) f1.close() ssh.close() f0.close() toc time.perf_counter() print(Congratulations You Have Backed Up Your 90DaysOfDevOps Lab) print(fYour backup duration was {toc - tic:0.4f} seconds) dt_string now.strftime(%d/%m/%Y %H:%M:%S) print(Your backup completed at, dt_string)配套的 backup.txt 中按行列出要备份的设备 IP192.168.169.115 192.168.169.178 192.168.169.193 192.168.169.125 192.168.169.197运行后终端会依次显示备份开始时间、每台设备的执行过程、总耗时与完成时间随后在脚本目录下生成以IP_年月日_时分秒命名的备份文件。仓库中已包含一次真实备份产物例如 192.168.169.115_20220127_145846内容为该设备的完整show running-config回显可打开对照查看备份格式与内容。两点改进建议示例中备份文件前缀filename_prefix变量在仓库脚本中未实际使用文件直接写在脚本所在目录真实环境中建议用完整路径把备份集中存放并考虑用getpass输入凭据而不是硬编码。六、扩展其他值得了解的自动化库除了 Paramiko 与 Netmiko网络自动化生态中还有两个仓库脚本未展开、但很常用的库netaddr专门处理 IP 地址与子网计算的库如地址解析、CIDR 运算、网段规划安装命令pip install netaddrxlrd用于读取 Excel 文件的库可以把多台交换机配置等表格数据读成矩阵便于批量驱动脚本安装命令pip install xlrd。此外Netmiko 作者维护的 pynet 仓库中还提供了更多网络自动化示例如演示文稿配套代码可作为后续深入学习的素材。七、总结一条脚本搞定「采配置、改配置、备配置」回顾本讲围绕 Day 26 的 EVE-NG 仿真网络我们用 Python 完成了三类核心运维动作并且都在仓库 2022/Days/Networking 中留有一一对应的可运行脚本运维动作核心脚本关键 API/手段批量采集接口信息netmiko_con_multi.pyConnectHandlersend_command批量下发 trunk 配置netmiko_sendchange.pyenable()send_config_set验证配置结果netmiko_con_multi_vlan.pysend_command(show int trunk)批量备份配置backup.py backup.txtParamikoinvoke_shellshow run选型建议追求厂商适配与开箱即用选 Netmiko它本身构建在 Paramiko 之上需要对 SSH 做底层精细控制SFTP、端口转发、自定义通道选 Paramiko。两者的组合例如 Netmiko 负责日常运维、Paramiko 处理备份等定制任务正是本讲仓库脚本呈现的典型分工。计算机网络系列到此告一段落。Day 27 也标志着从「网络原理」正式走向「网络即代码」的落地当设备规模从 5 台扩展到成百上千台时「集中控制 一次运行」的自动化脚本就是你最趁手的运维工具。下一站 Day 28 将进入云计算主题。参考资源Day 26 建 Lab 详情2022/vi/Days/day26.md网络自动化脚本与设备配置目录2022/Days/Networking本讲配图Day27_Networking3.png、Day27_Networking6.png、Day27_Networking8.png赞分享文档/教程【免费下载链接】90DaysOfDevOpsThis repository started out as a learning in public project for myself and has now become a structured learning map for many in the community. We have 3 years under our belt covering all things DevOps, including Principles, Processes, Tooling and Use Cases surrounding this vast topic.项目地址https://gitcode.com/gh_mirrors/90/90DaysOfDevOps点击查看免费下载相关推荐90DaysOfDevOps 实战用 Python Netmiko/Paramiko 自动化 EVE-NG 网络设备Day 2790DaysOfDevOps 实战用 Python Netmiko/Paramiko 自动化 EVE NG 网络设备Day 27 本篇以 90Days文档/教程90DaysOfDevOps 网络自动化实战用 Python Netmiko/Paramiko 管理 EVE-NG 仿真设备Day 2790DaysOfDevOps 网络自动化实战用 Python Netmiko/Paramiko 管理 EVE NG 仿真设备Day 27 本文对应 9文档/教程90DaysOfDevOps 第27天用 Python 与 Netmiko 实战网络设备自动化90DaysOfDevOps 第27天用 Python 与 Netmiko 实战网络设备自动化 本指南围绕 90DaysOfDevOps 网络基础章节的收尾篇文档/教程上一篇初识智能体从概念原理到 5 分钟构建你的第一个 LLM Agenthello-agents 第一章实战指南下一篇Universal Android Debloater深度评测为什么它能提升你的设备性能创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

CMake Presets 配置调试:详解 configurePresets 的 debug 对象(output / tryCompile / find)

CMake Presets 配置调试:详解 configurePresets 的 debug 对象(output / tryCompile / find)

构建工具开发工具CLI 【免费下载链接】CMake Mirror of CMake upstream repository 项目地址: https://gitcode.com/gh_mirrors/cm/CMake 点击查看 免费下载 本指南以 CMake 仓库中的 debug-properties.rst 为核心,系统讲解 CMakePresets.json 中 confi…

2026/10/7 9:29:20 阅读更多 →
Kubernetes 优雅终止(Graceful Termination)避坑指南:preStop 钩子与连接排空排查

Kubernetes 优雅终止(Graceful Termination)避坑指南:preStop 钩子与连接排空排查

Kubernetes 优雅终止(Graceful Termination)避坑指南:preStop 钩子与连接排空排查在 Kubernetes 生产环境中,很多团队都遇到过这样一个令人抓狂的诡异现象:服务在日常发布、或者 HPA(水平 Pod 自动扩缩&…

2026/10/7 9:29:20 阅读更多 →
10分钟语音训练专属AI变声模型:RVC 新手完整指南

10分钟语音训练专属AI变声模型:RVC 新手完整指南

10分钟语音训练专属AI变声模型&#xff1a;RVC 新手完整指南 【免费下载链接】Retrieval-based-Voice-Conversion-WebUI Easily train a good VC model with voice data < 10 mins! 项目地址: https://gitcode.com/GitHub_Trending/re/Retrieval-based-Voice-Conversion-W…

2026/10/7 9:28:20 阅读更多 →

最新新闻

从分享面板跳进应用后进程被重建:HarmonyOS 7 ShareExtension 冷启动如何避免重复导入

从分享面板跳进应用后进程被重建:HarmonyOS 7 ShareExtension 冷启动如何避免重复导入

从分享面板跳进应用后进程被重建&#xff1a;HarmonyOS 7 ShareExtension 冷启动如何避免重复导入 先看问题是怎么发生的 用户从系统分享面板进入目标应用&#xff0c;图片刚解析一半&#xff0c;进程因为资源回收被重建。页面恢复后又读一次 SharedData&#xff0c;最终同一张…

2026/10/7 10:06:48 阅读更多 →
裁决台账双向互校(下):台账哈希链、三向对账与最小落地

裁决台账双向互校(下):台账哈希链、三向对账与最小落地

裁决台账双向互校&#xff08;下&#xff09;&#xff1a;台账哈希链、三向对账与最小落地 系列&#xff1a;《宪法即代码》第 31 篇&#xff08;下&#xff09;&#xff5c; 标签建议&#xff1a;AI编程、Rust、架构治理、CI、可追溯性 文章目录裁决台账双向互校&#xff08;下…

2026/10/7 10:06:48 阅读更多 →
华为OD机试真题 新系统 2026-09-20 JavaGoC【递增差排列】

华为OD机试真题 新系统 2026-09-20 JavaGoC【递增差排列】

目录 题目 思路 Code 题目 题目内容: 给定两个正整数 n 和 k(其中 1≤k≤n≤8),从 [1,n] 中选取 k 个元素,排成长度为 k 的有序数组,按如下条件筛选排列组合后返回: - 数组中的元素取自整数 [1,n],且互不相同。 - 对于数组中任意连续三个元素 a[i],a[i+1],a[i+…

2026/10/7 10:06:48 阅读更多 →
Redis明明只是单线程,为什么这么快?

Redis明明只是单线程,为什么这么快?

在后端面试中&#xff0c;有一个经典的“灵魂拷问”&#xff1a;“Redis 是单线程的&#xff0c;为什么还能这么快&#xff1f;” 很多人第一反应是“因为它是内存数据库”。但这只说对了一半。如果仅仅因为内存快&#xff0c;那多线程的内存数据库岂不是要起飞&#xff1f;为什…

2026/10/7 10:06:48 阅读更多 →
计算机架构三层真相:ISA、微架构与内存层次实战解析

计算机架构三层真相:ISA、微架构与内存层次实战解析

1. 这不是教科书里的“计算机架构”&#xff0c;而是我拆了27台服务器、重装过147次系统后&#xff0c;真正用得上的架构认知“计算机架构”这四个字&#xff0c;听起来像大学课堂PPT第一页的标题&#xff0c;冷、硬、带着点拒人千里的学术感。但如果你真在机房里蹲过整夜排查C…

2026/10/7 10:06:48 阅读更多 →
《论持久战》的精髓与要点毛泽东,1938年5月 · 针对抗日战争战略问题的系统性答复核心命题:不是“只要坚持就能胜利”,而是“在敌强我弱的客观起点上,靠矛盾转化与能动作战,把战略防御走成战略反攻

《论持久战》的精髓与要点毛泽东,1938年5月 · 针对抗日战争战略问题的系统性答复核心命题:不是“只要坚持就能胜利”,而是“在敌强我弱的客观起点上,靠矛盾转化与能动作战,把战略防御走成战略反攻

《论持久战》的精髓与要点毛泽东&#xff0c;1938年5月 针对抗日战争战略问题的系统性答复核心命题&#xff1a;不是“只要坚持就能胜利”&#xff0c;而是“在敌强我弱的客观起点上&#xff0c;靠矛盾转化与能动作战&#xff0c;把战略防御走成战略反攻”《论持久战》写于193…

2026/10/7 10:05:47 阅读更多 →

日新闻

ROS2机械臂仿真与运动控制:从URDF建模到Gazebo实战全解析

ROS2机械臂仿真与运动控制:从URDF建模到Gazebo实战全解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/7 1:01:58 阅读更多 →
用浏览器直接改ESP32的WiFi密码:NVS键值配置工具设计与实现

用浏览器直接改ESP32的WiFi密码:NVS键值配置工具设计与实现

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/7 1:02:00 阅读更多 →
芯片封装缺陷检测:扫描声学显微镜(SAT)原理与实操指南

芯片封装缺陷检测:扫描声学显微镜(SAT)原理与实操指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/7 1:02:00 阅读更多 →

周新闻

KT148A语音芯片外挂8002D功放的工程实践指南

KT148A语音芯片外挂8002D功放的工程实践指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/6 7:15:40 阅读更多 →
LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/6 5:29:09 阅读更多 →
ARM架构深度解析:从RISC设计理念到交叉编译实战

ARM架构深度解析:从RISC设计理念到交叉编译实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/7 9:29:10 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/6 8:21:32 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/6 4:21:51 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/6 1:18:13 阅读更多 →