[{"data":1,"prerenderedAt":952},["ShallowReactive",2],{"navigation":3,"blogNavigation":232,"page-\u002Fdocs\u002Fswitchops%E4%BA%A4%E6%8D%A2%E6%9C%BA%E5%B7%A1%E6%A3%80\u002Ftroubleshooting-security":418,"\u002Fdocs\u002Fswitchops%E4%BA%A4%E6%8D%A2%E6%9C%BA%E5%B7%A1%E6%A3%80\u002Ftroubleshooting-security-surround":949},[4],{"title":5,"path":6,"stem":7,"children":8,"page":57},"Docs","\u002Fdocs","docs",[9,176,184],{"title":10,"path":11,"stem":12,"children":13,"icon":16},"简单文档","\u002Fdocs\u002F简单文档","docs\u002F1.简单文档\u002F1.index",[14,17,22,58,63,166,171],{"title":15,"path":11,"stem":12,"icon":16},"入门简介","lucide-house",{"title":18,"path":19,"stem":20,"icon":21},"安装与开发","\u002Fdocs\u002F简单文档\u002Finstallation","docs\u002F1.简单文档\u002F2.installation","lucide-play",{"title":23,"path":24,"stem":25,"children":26,"page":57},"开始写作","\u002Fdocs\u002F简单文档\u002Fwriting","docs\u002F1.简单文档\u002F3.writing",[27,32,37,42,47,52],{"title":28,"path":29,"stem":30,"icon":31},"Markdown","\u002Fdocs\u002F简单文档\u002Fwriting\u002Fmarkdown","docs\u002F1.简单文档\u002F3.writing\u002F1.markdown","simple-icons:markdown",{"title":33,"path":34,"stem":35,"icon":36},"页面 frontmatter","\u002Fdocs\u002F简单文档\u002Fwriting\u002Fpages","docs\u002F1.简单文档\u002F3.writing\u002F2.pages","lucide:file-text",{"title":38,"path":39,"stem":40,"icon":41},"目录与文件命名","\u002Fdocs\u002F简单文档\u002Fwriting\u002Ffolders","docs\u002F1.简单文档\u002F3.writing\u002F3.folders","lucide:folder",{"title":43,"path":44,"stem":45,"icon":46},"单页面示例","\u002Fdocs\u002F简单文档\u002Fwriting\u002Ffull-page-example","docs\u002F1.简单文档\u002F3.writing\u002F4.full-page-example","lucide:layout-template",{"title":48,"path":49,"stem":50,"icon":51},"内容检查与测试","\u002Fdocs\u002F简单文档\u002Fwriting\u002Ftest","docs\u002F1.简单文档\u002F3.writing\u002F5.test","lucide:shield-check",{"title":53,"path":54,"stem":55,"icon":56},"在文章中使用组件","\u002Fdocs\u002F简单文档\u002Fwriting\u002Fmdc-content","docs\u002F1.简单文档\u002F3.writing\u002F6.mdc-content","lucide-blocks",false,{"title":59,"path":60,"stem":61,"icon":62},"部署服务","\u002Fdocs\u002F简单文档\u002Fdeployment","docs\u002F1.简单文档\u002F4.deployment","lucide:cloud",{"title":64,"path":65,"stem":66,"children":67,"page":57},"组件特性","\u002Fdocs\u002F简单文档\u002Fcomponents","docs\u002F1.简单文档\u002F5.components",[68,73,77,81,85,89,93,97,101,105,110,114,118,122,126,131,136,141,146,150,154,158,162],{"title":69,"path":70,"stem":71,"icon":72},"常用组件","\u002Fdocs\u002F简单文档\u002Fcomponents\u002Fapi","docs\u002F1.简单文档\u002F5.components\u002F1.API","lucide-component",{"title":74,"path":75,"stem":76},"Alert","\u002Fdocs\u002F简单文档\u002Fcomponents\u002Falert","docs\u002F1.简单文档\u002F5.components\u002Falert",{"title":78,"path":79,"stem":80},"Badge","\u002Fdocs\u002F简单文档\u002Fcomponents\u002Fbadge","docs\u002F1.简单文档\u002F5.components\u002Fbadge",{"title":82,"path":83,"stem":84},"Button Link","\u002Fdocs\u002F简单文档\u002Fcomponents\u002Fbutton-link","docs\u002F1.简单文档\u002F5.components\u002Fbutton-link",{"title":86,"path":87,"stem":88},"Callout","\u002Fdocs\u002F简单文档\u002Fcomponents\u002Fcallout","docs\u002F1.简单文档\u002F5.components\u002Fcallout",{"title":90,"path":91,"stem":92},"Card","\u002Fdocs\u002F简单文档\u002Fcomponents\u002Fcard","docs\u002F1.简单文档\u002F5.components\u002Fcard",{"title":94,"path":95,"stem":96},"Card Group","\u002Fdocs\u002F简单文档\u002Fcomponents\u002Fcard-group","docs\u002F1.简单文档\u002F5.components\u002Fcard-group",{"title":98,"path":99,"stem":100},"Code Group","\u002Fdocs\u002F简单文档\u002Fcomponents\u002Fcode-group","docs\u002F1.简单文档\u002F5.components\u002Fcode-group",{"title":102,"path":103,"stem":104},"Code Tree","\u002Fdocs\u002F简单文档\u002Fcomponents\u002Fcode-tree","docs\u002F1.简单文档\u002F5.components\u002Fcode-tree",{"title":106,"path":107,"stem":108,"icon":109},"博客与文档内容块","\u002Fdocs\u002F简单文档\u002Fcomponents\u002Fcontent-blocks","docs\u002F1.简单文档\u002F5.components\u002Fcontent-blocks","lucide-panels-top-left",{"title":111,"path":112,"stem":113},"Field","\u002Fdocs\u002F简单文档\u002Fcomponents\u002Ffield","docs\u002F1.简单文档\u002F5.components\u002Ffield",{"title":115,"path":116,"stem":117},"Field Group","\u002Fdocs\u002F简单文档\u002Fcomponents\u002Ffield-group","docs\u002F1.简单文档\u002F5.components\u002Ffield-group",{"title":119,"path":120,"stem":121},"File Tree","\u002Fdocs\u002F简单文档\u002Fcomponents\u002Ffile-tree","docs\u002F1.简单文档\u002F5.components\u002Ffile-tree",{"title":123,"path":124,"stem":125},"Icon","\u002Fdocs\u002F简单文档\u002Fcomponents\u002Ficon","docs\u002F1.简单文档\u002F5.components\u002Ficon",{"title":127,"path":128,"stem":129,"icon":130},"数据、API 与阅读交互组件","\u002Fdocs\u002F简单文档\u002Fcomponents\u002Finteractive-blocks","docs\u002F1.简单文档\u002F5.components\u002Finteractive-blocks","lucide-table-properties",{"title":132,"path":133,"stem":134,"icon":135},"进阶组件交互演示","\u002Fdocs\u002F简单文档\u002Fcomponents\u002Finteractive-showcase","docs\u002F1.简单文档\u002F5.components\u002Finteractive-showcase","lucide-sliders-horizontal",{"title":137,"path":138,"stem":139,"icon":140},"MDC 语法与组件注册","\u002Fdocs\u002F简单文档\u002Fcomponents\u002Fmdc-guide","docs\u002F1.简单文档\u002F5.components\u002Fmdc-guide","lucide-file-code",{"title":142,"path":143,"stem":144,"icon":145},"MDC 组件交互演示","\u002Fdocs\u002F简单文档\u002Fcomponents\u002Fmdc-showcase","docs\u002F1.简单文档\u002F5.components\u002Fmdc-showcase","lucide-mouse-pointer-click",{"title":147,"path":148,"stem":149},"Playground","\u002Fdocs\u002F简单文档\u002Fcomponents\u002Fplayground","docs\u002F1.简单文档\u002F5.components\u002Fplayground",{"title":151,"path":152,"stem":153},"Read More","\u002Fdocs\u002F简单文档\u002Fcomponents\u002Fread-more","docs\u002F1.简单文档\u002F5.components\u002Fread-more",{"title":155,"path":156,"stem":157},"Stack","\u002Fdocs\u002F简单文档\u002Fcomponents\u002Fstack","docs\u002F1.简单文档\u002F5.components\u002Fstack",{"title":159,"path":160,"stem":161},"Steps","\u002Fdocs\u002F简单文档\u002Fcomponents\u002Fsteps","docs\u002F1.简单文档\u002F5.components\u002Fsteps",{"title":163,"path":164,"stem":165},"Tabs","\u002Fdocs\u002F简单文档\u002Fcomponents\u002Ftabs","docs\u002F1.简单文档\u002F5.components\u002Ftabs",{"title":167,"path":168,"stem":169,"icon":170},"功能与路线图","\u002Fdocs\u002F简单文档\u002F功能与路线图","docs\u002F1.简单文档\u002F6.功能与路线图","lucide:map",{"title":172,"path":173,"stem":174,"icon":175},"Nuxt Studio 现状与运维说明","\u002Fdocs\u002F简单文档\u002Fnuxt-studio-upgrade-plan","docs\u002F1.简单文档\u002F7.nuxt-studio-upgrade-plan","simple-icons:nuxtdotjs",{"title":177,"path":178,"stem":179,"children":180,"icon":183},"无人自助系统","\u002Fdocs\u002F无人自助系统","docs\u002F2.无人自助系统\u002F1.index",[181],{"title":182,"path":178,"stem":179,"icon":183},"介绍","simple-icons:opencollective",{"title":185,"path":186,"stem":187,"children":188,"icon":191},"SwitchOps 交换机巡检","\u002Fdocs\u002Fswitchops交换机巡检","docs\u002F3.SwitchOps交换机巡检\u002F1.index",[189,192,197,202,207,212,217,222,227],{"title":190,"path":186,"stem":187,"icon":191},"产品简介","lucide:house",{"title":193,"path":194,"stem":195,"icon":196},"快速开始","\u002Fdocs\u002Fswitchops交换机巡检\u002Fquick-start","docs\u002F3.SwitchOps交换机巡检\u002F2.quick-start","lucide:rocket",{"title":198,"path":199,"stem":200,"icon":201},"设备清单配置","\u002Fdocs\u002Fswitchops交换机巡检\u002Fdevice-config","docs\u002F3.SwitchOps交换机巡检\u002F3.device-config","lucide:list-tree",{"title":203,"path":204,"stem":205,"icon":206},"图形界面使用","\u002Fdocs\u002Fswitchops交换机巡检\u002Fgui-guide","docs\u002F3.SwitchOps交换机巡检\u002F4.gui-guide","lucide:monitor",{"title":208,"path":209,"stem":210,"icon":211},"命令行使用","\u002Fdocs\u002Fswitchops交换机巡检\u002Fcli-guide","docs\u002F3.SwitchOps交换机巡检\u002F5.cli-guide","lucide:square-terminal",{"title":213,"path":214,"stem":215,"icon":216},"报告与历史数据","\u002Fdocs\u002Fswitchops交换机巡检\u002Freports-history","docs\u002F3.SwitchOps交换机巡检\u002F6.reports-history","lucide:file-chart-column",{"title":218,"path":219,"stem":220,"icon":221},"高级配置","\u002Fdocs\u002Fswitchops交换机巡检\u002Fadvanced-config","docs\u002F3.SwitchOps交换机巡检\u002F7.advanced-config","lucide:settings",{"title":223,"path":224,"stem":225,"icon":226},"Windows 打包部署","\u002Fdocs\u002Fswitchops交换机巡检\u002Fwindows-deployment","docs\u002F3.SwitchOps交换机巡检\u002F8.windows-deployment","lucide:package",{"title":228,"path":229,"stem":230,"icon":231},"故障排查与安全","\u002Fdocs\u002Fswitchops交换机巡检\u002Ftroubleshooting-security","docs\u002F3.SwitchOps交换机巡检\u002F9.troubleshooting-security","lucide:shield-alert",[233],{"title":234,"path":235,"stem":236,"children":237,"page":57},"Blog","\u002Fblog","blog",[238,401,410],{"title":239,"path":240,"stem":241,"children":242,"page":57},"技术栈","\u002Fblog\u002F技术栈","blog\u002F1.技术栈",[243,248,253,258,262,267,271,276,280,284,289,294,299,303,307,311,315,319,324,328,333,338,343,347,352,357,362,367,372,376,381,386,391,396],{"title":244,"path":245,"stem":246,"icon":247},"最近给文档站补了些什么","\u002Fblog\u002F技术栈\u002Festel-docs-recent-updates","blog\u002F1.技术栈\u002F968.estel-docs-recent-updates","lucide:blocks",{"title":249,"path":250,"stem":251,"icon":252},"国产化终端能上办公网，却登录不了 OA：一次网络准入故障排查","\u002Fblog\u002F技术栈\u002F国产化终端办公oa网络准入故障排查","blog\u002F1.技术栈\u002F969.国产化终端办公OA网络准入故障排查","lucide:network",{"title":254,"path":255,"stem":256,"icon":257},"准备新的插件","\u002Fblog\u002F技术栈\u002F新的插件","blog\u002F1.技术栈\u002F970.新的插件","simple-icons:debian",{"title":259,"path":260,"stem":261,"icon":257},"防于未然，先固不破 — Debian 12 快速加固实战","\u002Fblog\u002F技术栈\u002F服务器加固实战","blog\u002F1.技术栈\u002F971.服务器加固实战",{"title":263,"path":264,"stem":265,"icon":266},"nmap高级应用技巧-实战","\u002Fblog\u002F技术栈\u002Fnmap高级应用技巧-实战","blog\u002F1.技术栈\u002F972.nmap高级应用技巧-实战","simple-icons:openstreetmap",{"title":268,"path":269,"stem":270,"icon":266},"nmap高级应用技巧-NSE","\u002Fblog\u002F技术栈\u002Fnmap高级应用技巧-nse","blog\u002F1.技术栈\u002F973.nmap高级应用技巧-NSE",{"title":272,"path":273,"stem":274,"icon":275},"部分vue组件语法预览","\u002Fblog\u002F技术栈\u002F部分组件语法展示","blog\u002F1.技术栈\u002F974.部分组件语法展示","simple-icons:vuedotjs",{"title":277,"path":278,"stem":279,"icon":175},"新的文档渲染样式","\u002Fblog\u002F技术栈\u002F新的文档渲染样式","blog\u002F1.技术栈\u002F975.新的文档渲染样式",{"title":281,"path":282,"stem":283,"icon":175},"Nuxt 微信分享接口","\u002Fblog\u002F技术栈\u002Fnuxt-微信分享接口","blog\u002F1.技术栈\u002F976.Nuxt 微信分享接口",{"title":285,"path":286,"stem":287,"icon":288},"AI复合应用 合同审查","\u002Fblog\u002F技术栈\u002Fai复合应用-合同审查","blog\u002F1.技术栈\u002F978.AI复合应用 合同审查","simple-icons:openai",{"title":290,"path":291,"stem":292,"icon":293},"Kali 安装 GVM","\u002Fblog\u002F技术栈\u002Fkali-安装-gvm","blog\u002F1.技术栈\u002F979.Kali 安装 GVM","simple-icons:kalilinux",{"title":295,"path":296,"stem":297,"icon":298},"GPT-5","\u002Fblog\u002F技术栈\u002Fgpt5","blog\u002F1.技术栈\u002F980.GPT5","simple-icons:powershell",{"title":300,"path":301,"stem":302,"icon":288},"使用 AI 守护内网安全","\u002Fblog\u002F技术栈\u002F使用-ai-守护内网安全","blog\u002F1.技术栈\u002F981.使用 AI 守护内网安全",{"title":304,"path":305,"stem":306,"icon":266},"系统安全扫描工具命令集合","\u002Fblog\u002F技术栈\u002F系统安全扫描工具命令集合","blog\u002F1.技术栈\u002F982.系统安全扫描工具命令集合",{"title":308,"path":309,"stem":310},"用 MDC 组织技术文章","\u002Fblog\u002F技术栈\u002Fmdc-article-example","blog\u002F1.技术栈\u002F983.mdc-article-example",{"title":312,"path":313,"stem":314,"icon":293},"系统安全综合评估报告","\u002Fblog\u002F技术栈\u002F系统安全综合评估报告","blog\u002F1.技术栈\u002F983.系统安全综合评估报告",{"title":316,"path":317,"stem":318},"用交互组件写一份技术说明","\u002Fblog\u002F技术栈\u002Fmdc-interactive-example","blog\u002F1.技术栈\u002F984.mdc-interactive-example",{"title":320,"path":321,"stem":322,"icon":323},"树莓派安装 Kali Linux","\u002Fblog\u002F技术栈\u002F树莓派安装-kali-linux","blog\u002F1.技术栈\u002F984.树莓派安装 Kali Linux","simple-icons:raspberrypi",{"title":325,"path":326,"stem":327,"icon":175},"Nuxt UI Pro","\u002Fblog\u002F技术栈\u002Fnuxt-ui-pro","blog\u002F1.技术栈\u002F985.Nuxt UI Pro",{"title":329,"path":330,"stem":331,"icon":332},"Supabase 阿里云短信","\u002Fblog\u002F技术栈\u002Fsupabase-阿里云短信","blog\u002F1.技术栈\u002F986.Supabase 阿里云短信","simple-icons:alibabacloud",{"title":334,"path":335,"stem":336,"icon":337},"Coolify","\u002Fblog\u002F技术栈\u002Fcoolify","blog\u002F1.技术栈\u002F987.Coolify","simple-icons:chai",{"title":339,"path":340,"stem":341,"icon":342},"Python 代码规范","\u002Fblog\u002F技术栈\u002Fpython-代码规范","blog\u002F1.技术栈\u002F988.Python 代码规范","simple-icons:python",{"title":344,"path":345,"stem":346,"icon":175},"Nuxt3 代码规范","\u002Fblog\u002F技术栈\u002Fnuxt3-代码规范","blog\u002F1.技术栈\u002F989.Nuxt3 代码规范",{"title":348,"path":349,"stem":350,"icon":351},"Linux 系统 Swap 分区配置指南","\u002Fblog\u002F技术栈\u002Flinux-系统-swap-分区配置指南","blog\u002F1.技术栈\u002F990.Linux 系统 Swap 分区配置指南","simple-icons:linux",{"title":353,"path":354,"stem":355,"icon":356},"从Supabase迁移到Appwrite","\u002Fblog\u002F技术栈\u002F从supabase迁移到appwrite","blog\u002F1.技术栈\u002F991.从Supabase迁移到Appwrite","simple-icons:supabase",{"title":358,"path":359,"stem":360,"icon":361},"AppWrite 项目资源占用情况","\u002Fblog\u002F技术栈\u002Fappwrite-项目资源占用情况","blog\u002F1.技术栈\u002F992.AppWrite 项目资源占用情况","simple-icons:appwrite",{"title":363,"path":364,"stem":365,"icon":366},"Docker 里配置hosts","\u002Fblog\u002F技术栈\u002Fdocker-里配置hosts","blog\u002F1.技术栈\u002F993.Docker 里配置hosts","simple-icons:docker",{"title":368,"path":369,"stem":370,"icon":371},"MySQL 中如何忽略表名的大小写","\u002Fblog\u002F技术栈\u002Fmysql-中如何忽略表名的大小写","blog\u002F1.技术栈\u002F994.MySQL 中如何忽略表名的大小写","simple-icons:mysql",{"title":373,"path":374,"stem":375,"icon":257},"Debian 12 安装nodejs","\u002Fblog\u002F技术栈\u002Fdebian-12-安装nodejs","blog\u002F1.技术栈\u002F995.Debian 12 安装nodejs",{"title":377,"path":378,"stem":379,"icon":380},"Dify + Supabase：打造带数据库的AI问答机器人","\u002Fblog\u002F技术栈\u002Fdify-supabase：打造带数据库的ai问答机器人","blog\u002F1.技术栈\u002F996.Dify + Supabase：打造带数据库的AI问答机器人","simple-icons:reactbootstrap",{"title":382,"path":383,"stem":384,"icon":385},"安装 VS Code到浏览器 -- Code Server","\u002Fblog\u002F技术栈\u002F安装-vs-code到浏览器-code-server-copy","blog\u002F1.技术栈\u002F996.安装 VS Code到浏览器 -- Code Server copy","simple-icons:visualstudiocode",{"title":387,"path":388,"stem":389,"icon":390},"Debian 12 云服务器初始安全设置与优化指南","\u002Fblog\u002F技术栈\u002Fdebian-12-云服务器初始安全设置与优化指南","blog\u002F1.技术栈\u002F997.Debian 12 云服务器初始安全设置与优化指南","lucide-server",{"title":392,"path":393,"stem":394,"icon":395},"Iperf3 万兆网络打流测试指南","\u002Fblog\u002F技术栈\u002Fiperf3-万兆网络打流测试指南","blog\u002F1.技术栈\u002F998.Iperf3 万兆网络打流测试指南","lucide-network",{"title":397,"path":398,"stem":399,"icon":400},"GROK3 and Deepseek","\u002Fblog\u002F技术栈\u002Fgrok3-and-deepseek","blog\u002F1.技术栈\u002F999.GROK3-and-Deepseek","lucide-brain",{"title":402,"path":403,"stem":404,"children":405,"page":57},"AI","\u002Fblog\u002Fai","blog\u002F2.AI",[406],{"title":407,"path":408,"stem":409,"icon":337},"AI最佳实践","\u002Fblog\u002Fai\u002Fai","blog\u002F2.AI\u002F01.AI",{"title":411,"path":412,"stem":413,"children":414,"page":57},"生活","\u002Fblog\u002F生活","blog\u002F3.生活",[415],{"title":411,"path":416,"stem":417,"icon":337},"\u002Fblog\u002F生活\u002F生活","blog\u002F3.生活\u002F01.生活",{"id":419,"title":228,"badges":420,"body":421,"date":420,"description":941,"draft":57,"extension":942,"fullpage":57,"icon":420,"links":420,"meta":943,"navBadges":420,"navigation":944,"path":229,"rawbody":945,"seo":946,"stem":230,"updated":947,"__hash__":948},"docs\u002Fdocs\u002F3.SwitchOps交换机巡检\u002F9.troubleshooting-security.md",null,{"type":422,"value":423,"toc":932},"minimark",[424,428,432,473,476,723,726,729,739,742,748,751,754,757,763,766,787,790,810,813,816,896,899,922,928],[425,426,427],"h2",{"id":427},"推荐排查顺序",[429,430,431],"p",{},"遇到巡检失败时，按以下顺序检查：",[433,434,435,443,446,449,455,458,464,470],"ol",{},[436,437,438,442],"li",{},[439,440,441],"code",{},"devices.yaml"," 是否能正常加载。",[436,444,445],{},"管理电脑能否到达目标 IP 和 SSH 端口。",[436,447,448],{},"账号密码能否通过系统 SSH 客户端登录。",[436,450,451,454],{},[439,452,453],{},"device_type"," 是否与设备平台匹配。",[436,456,457],{},"巡检账号是否有权执行对应查询命令。",[436,459,460,463],{},[439,461,462],{},"logs\u002Fapp.log"," 中记录了什么错误。",[436,465,466,469],{},[439,467,468],{},"raw\u002F"," 是否保存了部分成功命令的回显。",[436,471,472],{},"Excel 中是连接失败、解析未知还是达到告警阈值。",[425,474,475],{"id":475},"常见问题",[477,478,479,495],"table",{},[480,481,482],"thead",{},[483,484,485,489,492],"tr",{},[486,487,488],"th",{},"现象",[486,490,491],{},"可能原因",[486,493,494],{},"处理方法",[496,497,498,520,531,550,561,580,591,602,613,624,635,646,657,668,679,690,709],"tbody",{},[483,499,500,504,513],{},[501,502,503],"td",{},"提示配置文件不存在",[501,505,506,507,509,510],{},"未创建 ",[439,508,441],{},"，或 EXE 同级缺少 ",[439,511,512],{},"config\u002F",[501,514,515,516,519],{},"从示例复制设备文件；部署 EXE 时复制完整 ",[439,517,518],{},"config"," 目录。",[483,521,522,525,528],{},[501,523,524],{},"提示 YAML 格式错误",[501,526,527],{},"缩进错误、使用 Tab、引号不成对",[501,529,530],{},"使用空格缩进，通过 YAML 编辑器检查语法。",[483,532,533,536,543],{},[501,534,535],{},"提示设备清单为空",[501,537,538,539,542],{},"顶层没有 ",[439,540,541],{},"devices","，或列表为空",[501,544,545,546,549],{},"确认使用 ",[439,547,548],{},"devices:"," 并至少配置一台设备。",[483,551,552,555,558],{},[501,553,554],{},"提示缺少必填字段",[501,556,557],{},"缺少名称、地址、设备类型、用户名或密码",[501,559,560],{},"根据错误中的设备序号补齐字段。",[483,562,563,566,577],{},[501,564,565],{},"没有可巡检的启用设备",[501,567,568,569,572,573,576],{},"全部 ",[439,570,571],{},"enabled: false","，或 ",[439,574,575],{},"--target"," 未精确匹配",[501,578,579],{},"启用目标设备，核对名称\u002FIP。",[483,581,582,585,588],{},[501,583,584],{},"SSH 连接超时",[501,586,587],{},"路由不通、端口被拦截、SSH 未启用或 device_type 不匹配",[501,589,590],{},"测试 TCP 端口，检查 ACL、防火墙、SSH 服务和平台类型。",[483,592,593,596,599],{},[501,594,595],{},"用户名或密码错误",[501,597,598],{},"凭据错误、账号锁定或认证方式不兼容",[501,600,601],{},"人工 SSH 登录验证，并检查 AAA\u002F本地用户配置。",[483,603,604,607,610],{},[501,605,606],{},"登录成功但命令失败",[501,608,609],{},"巡检账号权限不足，或该型号命令不同",[501,611,612],{},"在设备上人工执行命令，调整账号权限或只读命令模板。",[483,614,615,618,621],{},[501,616,617],{},"提示禁止执行非只读命令",[501,619,620],{},"命令前缀不在白名单或包含危险词",[501,622,623],{},"移除命令；不要绕过只读安全校验。",[483,625,626,629,632],{},[501,627,628],{},"CPU、内存显示未知",[501,630,631],{},"设备回显与当前正则规则不一致",[501,633,634],{},"查看 raw 文件，补充解析规则和测试。",[483,636,637,640,643],{},[501,638,639],{},"板卡、电源、风扇或温度显示未知",[501,641,642],{},"命令无对应信息或回显关键词未识别",[501,644,645],{},"核对命令模板和原始回显；未知项会进入关注摘要。",[483,647,648,651,654],{},[501,649,650],{},"端口台账为空",[501,652,653],{},"interface brief 命令失败或格式无法解析",[501,655,656],{},"检查原始回显，确认接口行包含可识别的 up\u002Fdown 状态。",[483,658,659,662,665],{},[501,660,661],{},"重点接口状态未知",[501,663,664],{},"端口名错误、命令失败或回显不含状态字段",[501,666,667],{},"使用完整接口名，并先执行单端口查询验证。",[483,669,670,673,676],{},[501,671,672],{},"Excel 无法生成或保存",[501,674,675],{},"文件被 Excel 占用、目录无写权限",[501,677,678],{},"关闭同名文件，检查输出目录权限后重试。",[483,680,681,684,687],{},[501,682,683],{},"查询结果为空",[501,685,686],{},"本地关键字没有匹配任何回显行",[501,688,689],{},"清空关键字重新查询，检查大小写以外的拼写和空格。",[483,691,692,695,698],{},[501,693,694],{},"趋势提示数据库不存在",[501,696,697],{},"尚未巡检，关闭了数据库，或数据库路径错误",[501,699,700,701,704,705,708],{},"先巡检一次，确认 ",[439,702,703],{},"db_enabled: true","，核对 ",[439,706,707],{},"--db","。",[483,710,711,714,717],{},[501,712,713],{},"EXE 双击无反应",[501,715,716],{},"配置缺失、依赖加载失败或被安全软件拦截",[501,718,719,720,722],{},"检查同级 ",[439,721,518],{},"，查看终端安全日志；必要时用源码模式定位。",[425,724,725],{"id":725},"读取日志",[429,727,728],{},"默认日志路径：",[730,731,737],"pre",{"className":732,"code":734,"language":735,"meta":736},[733],"language-text","outputs\u002FYYYY-MM-DD\u002Flogs\u002Fapp.log\n","text","",[439,738,734],{"__ignoreMap":736},[429,740,741],{},"重点搜索：",[730,743,746],{"className":744,"code":745,"language":735,"meta":736},[733],"连接失败\n命令执行失败\n禁止执行非只读命令\n历史数据库写入失败\n",[439,747,745],{"__ignoreMap":736},[429,749,750],{},"日志不会主动输出明文密码，但可能包含设备名称、IP、命令、文件路径和错误详情，分享前仍需脱敏。",[425,752,753],{"id":753},"原始回显与解析问题",[429,755,756],{},"连接成功但报告字段为“未知”时，先查看：",[730,758,761],{"className":759,"code":760,"language":735,"meta":736},[733],"outputs\u002FYYYY-MM-DD\u002Fraw\u002F\u003C设备名称>_\u003CIP>.txt\n",[439,762,760],{"__ignoreMap":736},[429,764,765],{},"判断顺序：",[433,767,768,771,774,777],{},[436,769,770],{},"对应命令是否成功执行。",[436,772,773],{},"回显是否完整，是否因分页或超时被截断。",[436,775,776],{},"当前型号的字段名称是否与解析器预期不同。",[436,778,779,780,783,784,708],{},"是否需要调整 ",[439,781,782],{},"commands.yaml"," 或 ",[439,785,786],{},"switch_ops\u002Fparser.py",[429,788,789],{},"修改解析器后运行测试：",[730,791,795],{"className":792,"code":793,"language":794,"meta":736,"style":736},"language-bash shiki shiki-themes github-light github-light github-dark vitesse-light vitesse-dark catppuccin-latte catppuccin-mocha one-light one-dark-pro material-theme-lighter material-theme-palenight min-light min-dark","pytest tests\u002F\n","bash",[439,796,797],{"__ignoreMap":736},[798,799,802,806],"span",{"class":800,"line":801},"line",1,[798,803,805],{"class":804},"sCf0g","pytest",[798,807,809],{"class":808},"s254i"," tests\u002F\n",[429,811,812],{},"新增规则应同时补充脱敏后的真实回显示例测试，避免修复一个型号后破坏其他型号。",[425,814,815],{"id":815},"安全使用清单",[817,818,821,831,841,847,856,862,868,878,884,890],"ul",{"className":819},[820],"contains-task-list",[436,822,825,830],{"className":823},[824],"task-list-item",[826,827],"input",{"disabled":828,"type":829},true,"checkbox"," 使用专用、最小权限、只读的交换机巡检账号。",[436,832,834,836,837,840],{"className":833},[824],[826,835],{"disabled":828,"type":829}," ",[439,838,839],{},"config\u002Fdevices.yaml"," 不提交 Git，不放入公共网盘或共享群聊。",[436,842,844,846],{"className":843},[824],[826,845],{"disabled":828,"type":829}," 管理电脑只允许从受控网络访问交换机管理地址。",[436,848,850,852,853,855],{"className":849},[824],[826,851],{"disabled":828,"type":829}," 不在 ",[439,854,782],{}," 中加入保存、重启、删除、配置模式命令。",[436,857,859,861],{"className":858},[824],[826,860],{"disabled":828,"type":829}," 新命令先在测试设备人工验证，再进行单台工具测试。",[436,863,865,867],{"className":864},[824],[826,866],{"disabled":828,"type":829}," 控制并发，避免对设备 SSH 管理平面造成压力。",[436,869,871,873,874,877],{"className":870},[824],[826,872],{"disabled":828,"type":829}," 保护 ",[439,875,876],{},"outputs\u002F","，因为原始回显可能暴露网络结构信息。",[436,879,881,883],{"className":880},[824],[826,882],{"disabled":828,"type":829}," 定期清理或归档报告、日志和查询结果。",[436,885,887,889],{"className":886},[824],[826,888],{"disabled":828,"type":829}," 发布 EXE 时保留源码版本、构建记录和文件摘要。",[436,891,893,895],{"className":892},[824],[826,894],{"disabled":828,"type":829}," 修改安全校验代码时执行人工复核和回归测试。",[425,897,898],{"id":898},"已知边界",[817,900,901,904,907,910,913,916,919],{},[436,902,903],{},"当前仅内置华为 VRP 和华三 Comware 命令模板。",[436,905,906],{},"解析基于常见回显正则，不同版本或型号可能出现“未知”。",[436,908,909],{},"停止任务为软停止，不会强制中断已经开始的 SSH 会话。",[436,911,912],{},"CLI 历史趋势是文本表格，不是完整的监控或告警平台。",[436,914,915],{},"SQLite 写入失败不会阻止 Excel 生成，需要关注日志中的历史库警告。",[436,917,918],{},"配置备份尚未开放，程序会拒绝读取当前或已保存配置的命令。",[436,920,921],{},"工具不能替代 SNMP、Telemetry、日志平台或厂商网管系统的持续监控。",[429,923,924,925,927],{},"如果同一类设备持续出现兼容问题，建议保留脱敏后的原始回显、设备型号、软件版本、",[439,926,453],{}," 和失败命令，作为后续适配依据。",[929,930,931],"style",{},"html pre.shiki code .sCf0g, html code.shiki .sCf0g{--shiki-light:#6F42C1;--shiki-light-font-style:inherit;--shiki-default:#6F42C1;--shiki-default-font-style:inherit;--shiki-dark:#B392F0;--shiki-dark-font-style:inherit;--shiki-code-theme-vitesse-light:#59873A;--shiki-code-theme-vitesse-light-font-style:inherit;--shiki-code-theme-vitesse-dark:#80A665;--shiki-code-theme-vitesse-dark-font-style:inherit;--shiki-code-theme-catppuccin-light:#1E66F5;--shiki-code-theme-catppuccin-light-font-style:italic;--shiki-code-theme-catppuccin-dark:#89B4FA;--shiki-code-theme-catppuccin-dark-font-style:italic;--shiki-code-theme-one-light:#4078F2;--shiki-code-theme-one-light-font-style:inherit;--shiki-code-theme-one-dark:#61AFEF;--shiki-code-theme-one-dark-font-style:inherit;--shiki-code-theme-material-light:#E2931D;--shiki-code-theme-material-light-font-style:inherit;--shiki-code-theme-material-dark:#FFCB6B;--shiki-code-theme-material-dark-font-style:inherit;--shiki-code-theme-min-light:#6F42C1;--shiki-code-theme-min-light-font-style:inherit;--shiki-code-theme-min-dark:#B392F0;--shiki-code-theme-min-dark-font-style:inherit}html pre.shiki code .s254i, html code.shiki .s254i{--shiki-light:#032F62;--shiki-default:#032F62;--shiki-dark:#9ECBFF;--shiki-code-theme-vitesse-light:#B56959;--shiki-code-theme-vitesse-dark:#C98A7D;--shiki-code-theme-catppuccin-light:#40A02B;--shiki-code-theme-catppuccin-dark:#A6E3A1;--shiki-code-theme-one-light:#50A14F;--shiki-code-theme-one-dark:#98C379;--shiki-code-theme-material-light:#91B859;--shiki-code-theme-material-dark:#C3E88D;--shiki-code-theme-min-light:#2B5581;--shiki-code-theme-min-dark:#9DB1C5}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html .code-theme-vitesse-light .shiki span {color: var(--shiki-code-theme-vitesse-light);background: var(--shiki-code-theme-vitesse-light-bg);font-style: var(--shiki-code-theme-vitesse-light-font-style);font-weight: var(--shiki-code-theme-vitesse-light-font-weight);text-decoration: var(--shiki-code-theme-vitesse-light-text-decoration);}html.code-theme-vitesse-light .shiki span {color: var(--shiki-code-theme-vitesse-light);background: var(--shiki-code-theme-vitesse-light-bg);font-style: var(--shiki-code-theme-vitesse-light-font-style);font-weight: var(--shiki-code-theme-vitesse-light-font-weight);text-decoration: var(--shiki-code-theme-vitesse-light-text-decoration);}html .code-theme-vitesse-dark .shiki span {color: var(--shiki-code-theme-vitesse-dark);background: var(--shiki-code-theme-vitesse-dark-bg);font-style: var(--shiki-code-theme-vitesse-dark-font-style);font-weight: var(--shiki-code-theme-vitesse-dark-font-weight);text-decoration: var(--shiki-code-theme-vitesse-dark-text-decoration);}html.code-theme-vitesse-dark .shiki span {color: var(--shiki-code-theme-vitesse-dark);background: var(--shiki-code-theme-vitesse-dark-bg);font-style: var(--shiki-code-theme-vitesse-dark-font-style);font-weight: var(--shiki-code-theme-vitesse-dark-font-weight);text-decoration: var(--shiki-code-theme-vitesse-dark-text-decoration);}html .code-theme-catppuccin-light .shiki span {color: var(--shiki-code-theme-catppuccin-light);background: var(--shiki-code-theme-catppuccin-light-bg);font-style: var(--shiki-code-theme-catppuccin-light-font-style);font-weight: var(--shiki-code-theme-catppuccin-light-font-weight);text-decoration: var(--shiki-code-theme-catppuccin-light-text-decoration);}html.code-theme-catppuccin-light .shiki span {color: var(--shiki-code-theme-catppuccin-light);background: var(--shiki-code-theme-catppuccin-light-bg);font-style: var(--shiki-code-theme-catppuccin-light-font-style);font-weight: var(--shiki-code-theme-catppuccin-light-font-weight);text-decoration: var(--shiki-code-theme-catppuccin-light-text-decoration);}html .code-theme-catppuccin-dark .shiki span {color: var(--shiki-code-theme-catppuccin-dark);background: var(--shiki-code-theme-catppuccin-dark-bg);font-style: var(--shiki-code-theme-catppuccin-dark-font-style);font-weight: var(--shiki-code-theme-catppuccin-dark-font-weight);text-decoration: var(--shiki-code-theme-catppuccin-dark-text-decoration);}html.code-theme-catppuccin-dark .shiki span {color: var(--shiki-code-theme-catppuccin-dark);background: var(--shiki-code-theme-catppuccin-dark-bg);font-style: var(--shiki-code-theme-catppuccin-dark-font-style);font-weight: var(--shiki-code-theme-catppuccin-dark-font-weight);text-decoration: var(--shiki-code-theme-catppuccin-dark-text-decoration);}html .code-theme-one-light .shiki span {color: var(--shiki-code-theme-one-light);background: var(--shiki-code-theme-one-light-bg);font-style: var(--shiki-code-theme-one-light-font-style);font-weight: var(--shiki-code-theme-one-light-font-weight);text-decoration: var(--shiki-code-theme-one-light-text-decoration);}html.code-theme-one-light .shiki span {color: var(--shiki-code-theme-one-light);background: var(--shiki-code-theme-one-light-bg);font-style: var(--shiki-code-theme-one-light-font-style);font-weight: var(--shiki-code-theme-one-light-font-weight);text-decoration: var(--shiki-code-theme-one-light-text-decoration);}html .code-theme-one-dark .shiki span {color: var(--shiki-code-theme-one-dark);background: var(--shiki-code-theme-one-dark-bg);font-style: var(--shiki-code-theme-one-dark-font-style);font-weight: var(--shiki-code-theme-one-dark-font-weight);text-decoration: var(--shiki-code-theme-one-dark-text-decoration);}html.code-theme-one-dark .shiki span {color: var(--shiki-code-theme-one-dark);background: var(--shiki-code-theme-one-dark-bg);font-style: var(--shiki-code-theme-one-dark-font-style);font-weight: var(--shiki-code-theme-one-dark-font-weight);text-decoration: var(--shiki-code-theme-one-dark-text-decoration);}html .code-theme-material-light .shiki span {color: var(--shiki-code-theme-material-light);background: var(--shiki-code-theme-material-light-bg);font-style: var(--shiki-code-theme-material-light-font-style);font-weight: var(--shiki-code-theme-material-light-font-weight);text-decoration: var(--shiki-code-theme-material-light-text-decoration);}html.code-theme-material-light .shiki span {color: var(--shiki-code-theme-material-light);background: var(--shiki-code-theme-material-light-bg);font-style: var(--shiki-code-theme-material-light-font-style);font-weight: var(--shiki-code-theme-material-light-font-weight);text-decoration: var(--shiki-code-theme-material-light-text-decoration);}html .code-theme-material-dark .shiki span {color: var(--shiki-code-theme-material-dark);background: var(--shiki-code-theme-material-dark-bg);font-style: var(--shiki-code-theme-material-dark-font-style);font-weight: var(--shiki-code-theme-material-dark-font-weight);text-decoration: var(--shiki-code-theme-material-dark-text-decoration);}html.code-theme-material-dark .shiki span {color: var(--shiki-code-theme-material-dark);background: var(--shiki-code-theme-material-dark-bg);font-style: var(--shiki-code-theme-material-dark-font-style);font-weight: var(--shiki-code-theme-material-dark-font-weight);text-decoration: var(--shiki-code-theme-material-dark-text-decoration);}html .code-theme-min-light .shiki span {color: var(--shiki-code-theme-min-light);background: var(--shiki-code-theme-min-light-bg);font-style: var(--shiki-code-theme-min-light-font-style);font-weight: var(--shiki-code-theme-min-light-font-weight);text-decoration: var(--shiki-code-theme-min-light-text-decoration);}html.code-theme-min-light .shiki span {color: var(--shiki-code-theme-min-light);background: var(--shiki-code-theme-min-light-bg);font-style: var(--shiki-code-theme-min-light-font-style);font-weight: var(--shiki-code-theme-min-light-font-weight);text-decoration: var(--shiki-code-theme-min-light-text-decoration);}html .code-theme-min-dark .shiki span {color: var(--shiki-code-theme-min-dark);background: var(--shiki-code-theme-min-dark-bg);font-style: var(--shiki-code-theme-min-dark-font-style);font-weight: var(--shiki-code-theme-min-dark-font-weight);text-decoration: var(--shiki-code-theme-min-dark-text-decoration);}html.code-theme-min-dark .shiki span {color: var(--shiki-code-theme-min-dark);background: var(--shiki-code-theme-min-dark-bg);font-style: var(--shiki-code-theme-min-dark-font-style);font-weight: var(--shiki-code-theme-min-dark-font-weight);text-decoration: var(--shiki-code-theme-min-dark-text-decoration);}",{"title":736,"searchDepth":933,"depth":933,"links":934},2,[935,936,937,938,939,940],{"id":427,"depth":933,"text":427},{"id":475,"depth":933,"text":475},{"id":725,"depth":933,"text":725},{"id":753,"depth":933,"text":753},{"id":815,"depth":933,"text":815},{"id":898,"depth":933,"text":898},"排查 SwitchOps 的配置、SSH、设备类型、命令、Excel 和 EXE 问题，并落实安全使用要求。","md",{},{"icon":231},"---\ntitle: 故障排查与安全\ndescription: 排查 SwitchOps 的配置、SSH、设备类型、命令、Excel 和 EXE 问题，并落实安全使用要求。\nupdated: 2026-09-04\nnavigation:\n  icon: lucide:shield-alert\n---\n\n## 推荐排查顺序\n\n遇到巡检失败时，按以下顺序检查：\n\n1. `devices.yaml` 是否能正常加载。\n2. 管理电脑能否到达目标 IP 和 SSH 端口。\n3. 账号密码能否通过系统 SSH 客户端登录。\n4. `device_type` 是否与设备平台匹配。\n5. 巡检账号是否有权执行对应查询命令。\n6. `logs\u002Fapp.log` 中记录了什么错误。\n7. `raw\u002F` 是否保存了部分成功命令的回显。\n8. Excel 中是连接失败、解析未知还是达到告警阈值。\n\n## 常见问题\n\n| 现象 | 可能原因 | 处理方法 |\n| --- | --- | --- |\n| 提示配置文件不存在 | 未创建 `devices.yaml`，或 EXE 同级缺少 `config\u002F` | 从示例复制设备文件；部署 EXE 时复制完整 `config` 目录。 |\n| 提示 YAML 格式错误 | 缩进错误、使用 Tab、引号不成对 | 使用空格缩进，通过 YAML 编辑器检查语法。 |\n| 提示设备清单为空 | 顶层没有 `devices`，或列表为空 | 确认使用 `devices:` 并至少配置一台设备。 |\n| 提示缺少必填字段 | 缺少名称、地址、设备类型、用户名或密码 | 根据错误中的设备序号补齐字段。 |\n| 没有可巡检的启用设备 | 全部 `enabled: false`，或 `--target` 未精确匹配 | 启用目标设备，核对名称\u002FIP。 |\n| SSH 连接超时 | 路由不通、端口被拦截、SSH 未启用或 device_type 不匹配 | 测试 TCP 端口，检查 ACL、防火墙、SSH 服务和平台类型。 |\n| 用户名或密码错误 | 凭据错误、账号锁定或认证方式不兼容 | 人工 SSH 登录验证，并检查 AAA\u002F本地用户配置。 |\n| 登录成功但命令失败 | 巡检账号权限不足，或该型号命令不同 | 在设备上人工执行命令，调整账号权限或只读命令模板。 |\n| 提示禁止执行非只读命令 | 命令前缀不在白名单或包含危险词 | 移除命令；不要绕过只读安全校验。 |\n| CPU、内存显示未知 | 设备回显与当前正则规则不一致 | 查看 raw 文件，补充解析规则和测试。 |\n| 板卡、电源、风扇或温度显示未知 | 命令无对应信息或回显关键词未识别 | 核对命令模板和原始回显；未知项会进入关注摘要。 |\n| 端口台账为空 | interface brief 命令失败或格式无法解析 | 检查原始回显，确认接口行包含可识别的 up\u002Fdown 状态。 |\n| 重点接口状态未知 | 端口名错误、命令失败或回显不含状态字段 | 使用完整接口名，并先执行单端口查询验证。 |\n| Excel 无法生成或保存 | 文件被 Excel 占用、目录无写权限 | 关闭同名文件，检查输出目录权限后重试。 |\n| 查询结果为空 | 本地关键字没有匹配任何回显行 | 清空关键字重新查询，检查大小写以外的拼写和空格。 |\n| 趋势提示数据库不存在 | 尚未巡检，关闭了数据库，或数据库路径错误 | 先巡检一次，确认 `db_enabled: true`，核对 `--db`。 |\n| EXE 双击无反应 | 配置缺失、依赖加载失败或被安全软件拦截 | 检查同级 `config`，查看终端安全日志；必要时用源码模式定位。 |\n\n## 读取日志\n\n默认日志路径：\n\n```text\noutputs\u002FYYYY-MM-DD\u002Flogs\u002Fapp.log\n```\n\n重点搜索：\n\n```text\n连接失败\n命令执行失败\n禁止执行非只读命令\n历史数据库写入失败\n```\n\n日志不会主动输出明文密码，但可能包含设备名称、IP、命令、文件路径和错误详情，分享前仍需脱敏。\n\n## 原始回显与解析问题\n\n连接成功但报告字段为“未知”时，先查看：\n\n```text\noutputs\u002FYYYY-MM-DD\u002Fraw\u002F\u003C设备名称>_\u003CIP>.txt\n```\n\n判断顺序：\n\n1. 对应命令是否成功执行。\n2. 回显是否完整，是否因分页或超时被截断。\n3. 当前型号的字段名称是否与解析器预期不同。\n4. 是否需要调整 `commands.yaml` 或 `switch_ops\u002Fparser.py`。\n\n修改解析器后运行测试：\n\n```bash\npytest tests\u002F\n```\n\n新增规则应同时补充脱敏后的真实回显示例测试，避免修复一个型号后破坏其他型号。\n\n## 安全使用清单\n\n- [ ] 使用专用、最小权限、只读的交换机巡检账号。\n- [ ] `config\u002Fdevices.yaml` 不提交 Git，不放入公共网盘或共享群聊。\n- [ ] 管理电脑只允许从受控网络访问交换机管理地址。\n- [ ] 不在 `commands.yaml` 中加入保存、重启、删除、配置模式命令。\n- [ ] 新命令先在测试设备人工验证，再进行单台工具测试。\n- [ ] 控制并发，避免对设备 SSH 管理平面造成压力。\n- [ ] 保护 `outputs\u002F`，因为原始回显可能暴露网络结构信息。\n- [ ] 定期清理或归档报告、日志和查询结果。\n- [ ] 发布 EXE 时保留源码版本、构建记录和文件摘要。\n- [ ] 修改安全校验代码时执行人工复核和回归测试。\n\n## 已知边界\n\n- 当前仅内置华为 VRP 和华三 Comware 命令模板。\n- 解析基于常见回显正则，不同版本或型号可能出现“未知”。\n- 停止任务为软停止，不会强制中断已经开始的 SSH 会话。\n- CLI 历史趋势是文本表格，不是完整的监控或告警平台。\n- SQLite 写入失败不会阻止 Excel 生成，需要关注日志中的历史库警告。\n- 配置备份尚未开放，程序会拒绝读取当前或已保存配置的命令。\n- 工具不能替代 SNMP、Telemetry、日志平台或厂商网管系统的持续监控。\n\n如果同一类设备持续出现兼容问题，建议保留脱敏后的原始回显、设备型号、软件版本、`device_type` 和失败命令，作为后续适配依据。\n",{"title":228,"description":941},"2026-09-04","mGAlubluERI3kG38v2jBVjdgFUn-H8Orb0BD1RVEvYw",[950,420],{"title":223,"path":224,"stem":225,"description":951,"icon":226,"children":-1},"使用 PyInstaller 构建 SwitchOps 单文件 EXE，并按推荐目录交付配置和输出数据。",1791307034407]