[{"data":1,"prerenderedAt":1247},["ShallowReactive",2],{"navigation":3,"blogNavigation":232,"page-\u002Fdocs\u002Fswitchops%E4%BA%A4%E6%8D%A2%E6%9C%BA%E5%B7%A1%E6%A3%80\u002Fadvanced-config":418,"\u002Fdocs\u002Fswitchops%E4%BA%A4%E6%8D%A2%E6%9C%BA%E5%B7%A1%E6%A3%80\u002Fadvanced-config-surround":1242},[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":218,"badges":420,"body":421,"date":420,"description":1234,"draft":57,"extension":1235,"fullpage":57,"icon":420,"links":420,"meta":1236,"navBadges":420,"navigation":1237,"path":219,"rawbody":1238,"seo":1239,"stem":220,"updated":1240,"__hash__":1241},"docs\u002Fdocs\u002F3.SwitchOps交换机巡检\u002F7.advanced-config.md",null,{"type":422,"value":423,"toc":1224},"minimark",[424,428,432,443,446,577,580,740,743,746,762,774,777,780,798,801,809,812,815,818,832,839,842,845,851,854,1031,1097,1100,1103,1121,1124,1130,1133,1144,1147,1150,1190,1193,1210,1220],[425,426,427],"h2",{"id":427},"全局设置",[429,430,431],"p",{},"全局配置文件为：",[433,434,440],"pre",{"className":435,"code":437,"language":438,"meta":439},[436],"language-text","config\u002Fsettings.yaml\n","text","",[441,442,437],"code",{"__ignoreMap":439},[429,444,445],{},"默认内容：",[433,447,452],{"className":448,"code":449,"filename":450,"language":451,"meta":439,"style":439},"language-yaml 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","concurrency: 5\nretry_times: 2\nconn_timeout: 20\ncommand_timeout: 60\ncpu_warn_threshold: 80\ncpu_critical_threshold: 90\nmemory_warn_threshold: 80\nmemory_critical_threshold: 90\noutput_root: \"outputs\"\ndb_enabled: true\n","config\u002Fsettings.yaml","yaml",[441,453,454,471,482,493,504,515,526,536,546,565],{"__ignoreMap":439},[455,456,459,463,467],"span",{"class":457,"line":458},"line",1,[455,460,462],{"class":461},"sBSHF","concurrency",[455,464,466],{"class":465},"stNAY",":",[455,468,470],{"class":469},"s_Zq6"," 5\n",[455,472,474,477,479],{"class":457,"line":473},2,[455,475,476],{"class":461},"retry_times",[455,478,466],{"class":465},[455,480,481],{"class":469}," 2\n",[455,483,485,488,490],{"class":457,"line":484},3,[455,486,487],{"class":461},"conn_timeout",[455,489,466],{"class":465},[455,491,492],{"class":469}," 20\n",[455,494,496,499,501],{"class":457,"line":495},4,[455,497,498],{"class":461},"command_timeout",[455,500,466],{"class":465},[455,502,503],{"class":469}," 60\n",[455,505,507,510,512],{"class":457,"line":506},5,[455,508,509],{"class":461},"cpu_warn_threshold",[455,511,466],{"class":465},[455,513,514],{"class":469}," 80\n",[455,516,518,521,523],{"class":457,"line":517},6,[455,519,520],{"class":461},"cpu_critical_threshold",[455,522,466],{"class":465},[455,524,525],{"class":469}," 90\n",[455,527,529,532,534],{"class":457,"line":528},7,[455,530,531],{"class":461},"memory_warn_threshold",[455,533,466],{"class":465},[455,535,514],{"class":469},[455,537,539,542,544],{"class":457,"line":538},8,[455,540,541],{"class":461},"memory_critical_threshold",[455,543,466],{"class":465},[455,545,525],{"class":469},[455,547,549,552,554,558,562],{"class":457,"line":548},9,[455,550,551],{"class":461},"output_root",[455,553,466],{"class":465},[455,555,557],{"class":556},"sLXf0"," \"",[455,559,561],{"class":560},"sCtJb","outputs",[455,563,564],{"class":556},"\"\n",[455,566,568,571,573],{"class":457,"line":567},10,[455,569,570],{"class":461},"db_enabled",[455,572,466],{"class":465},[455,574,576],{"class":575},"sle2E"," true\n",[425,578,579],{"id":579},"设置项说明",[581,582,583,599],"table",{},[584,585,586],"thead",{},[587,588,589,593,596],"tr",{},[590,591,592],"th",{},"设置",[590,594,595],{},"默认值",[590,597,598],{},"作用",[600,601,602,617,631,645,659,673,687,700,713,726],"tbody",{},[587,603,604,609,614],{},[605,606,607],"td",{},[441,608,462],{},[605,610,611],{},[441,612,613],{},"5",[605,615,616],{},"同时巡检的最大设备数。",[587,618,619,623,628],{},[605,620,621],{},[441,622,476],{},[605,624,625],{},[441,626,627],{},"2",[605,629,630],{},"首次失败后的重试次数；默认最多尝试 3 次。",[587,632,633,637,642],{},[605,634,635],{},[441,636,487],{},[605,638,639],{},[441,640,641],{},"20",[605,643,644],{},"SSH 连接、认证、Banner 和基础会话超时秒数。",[587,646,647,651,656],{},[605,648,649],{},[441,650,498],{},[605,652,653],{},[441,654,655],{},"60",[605,657,658],{},"单条交换机命令的读取超时秒数。",[587,660,661,665,670],{},[605,662,663],{},[441,664,509],{},[605,666,667],{},[441,668,669],{},"80",[605,671,672],{},"CPU 大于该值时标记关注。",[587,674,675,679,684],{},[605,676,677],{},[441,678,520],{},[605,680,681],{},[441,682,683],{},"90",[605,685,686],{},"CPU 大于等于该值时标记异常。",[587,688,689,693,697],{},[605,690,691],{},[441,692,531],{},[605,694,695],{},[441,696,669],{},[605,698,699],{},"内存大于该值时标记关注。",[587,701,702,706,710],{},[605,703,704],{},[441,705,541],{},[605,707,708],{},[441,709,683],{},[605,711,712],{},"内存大于等于该值时标记异常。",[587,714,715,719,723],{},[605,716,717],{},[441,718,551],{},[605,720,721],{},[441,722,561],{},[605,724,725],{},"报告、日志、查询和历史库的根目录。",[587,727,728,732,737],{},[605,729,730],{},[441,731,570],{},[605,733,734],{},[441,735,736],{},"true",[605,738,739],{},"是否保存 SQLite 历史记录。",[425,741,742],{"id":742},"调整并发和超时",[429,744,745],{},"大型网络不要直接把并发数调得很高。需要同时考虑：",[747,748,749,753,756,759],"ul",{},[750,751,752],"li",{},"管理电脑 CPU、内存和网络能力；",[750,754,755],{},"核心交换机允许的 SSH 并发会话数；",[750,757,758],{},"防火墙、堡垒机或准入设备的连接限制；",[750,760,761],{},"低性能接入交换机处理 CLI 命令的速度。",[429,763,764,765,767,768,770,771,773],{},"建议从 ",[441,766,613],{}," 开始，小规模验证后逐步调整。跨区域链路延迟较大时，可以适当增加 ",[441,769,487],{},"；MAC 地址表较大或设备回显较慢时，可以增加 ",[441,772,498],{},"。",[425,775,776],{"id":776},"修改输出目录",[429,778,779],{},"使用绝对路径：",[433,781,783],{"className":448,"code":782,"language":451,"meta":439,"style":439},"output_root: \"D:\u002FSwitchOpsData\"\n",[441,784,785],{"__ignoreMap":439},[455,786,787,789,791,793,796],{"class":457,"line":458},[455,788,551],{"class":461},[455,790,466],{"class":465},[455,792,557],{"class":556},[455,794,795],{"class":560},"D:\u002FSwitchOpsData",[455,797,564],{"class":556},[429,799,800],{},"使用相对路径时，路径相对于程序根目录：",[747,802,803,806],{},[750,804,805],{},"源码运行：项目根目录。",[750,807,808],{},"EXE 运行：EXE 所在目录。",[429,810,811],{},"输出目录必须允许当前 Windows 用户创建目录和文件。",[425,813,814],{"id":814},"关闭历史库",[429,816,817],{},"只需要当次 Excel，不需要长期趋势时：",[433,819,821],{"className":448,"code":820,"language":451,"meta":439,"style":439},"db_enabled: false\n",[441,822,823],{"__ignoreMap":439},[455,824,825,827,829],{"class":457,"line":458},[455,826,570],{"class":461},[455,828,466],{"class":465},[455,830,831],{"class":575}," false\n",[429,833,834,835,838],{},"已有的 ",[441,836,837],{},"outputs\u002Fhistory.db"," 不会被删除，只是后续巡检不再写入。",[425,840,841],{"id":841},"厂商命令模板",[429,843,844],{},"命令配置位于：",[433,846,849],{"className":847,"code":848,"language":438,"meta":439},[436],"config\u002Fcommands.yaml\n",[441,850,848],{"__ignoreMap":439},[429,852,853],{},"每个 profile 包含：",[433,855,857],{"className":448,"code":856,"language":451,"meta":439,"style":439},"profiles:\n  huawei:\n    paging_disable:\n      - \"screen-length 0 temporary\"\n    inspect_commands:\n      - \"display version\"\n      - \"display device\"\n      - \"display health\"\n      - \"display interface brief\"\n      - \"display vlan\"\n      - \"display mac-address\"\n      - \"display arp all\"\n    query_commands:\n      arp: \"display arp all\"\n      mac: \"display mac-address\"\n      interface: \"display interface {interface}\"\n",[441,858,859,867,874,881,894,901,912,923,934,945,956,968,980,988,1002,1016],{"__ignoreMap":439},[455,860,861,864],{"class":457,"line":458},[455,862,863],{"class":461},"profiles",[455,865,866],{"class":465},":\n",[455,868,869,872],{"class":457,"line":473},[455,870,871],{"class":461},"  huawei",[455,873,866],{"class":465},[455,875,876,879],{"class":457,"line":484},[455,877,878],{"class":461},"    paging_disable",[455,880,866],{"class":465},[455,882,883,887,889,892],{"class":457,"line":495},[455,884,886],{"class":885},"sIQTy","      -",[455,888,557],{"class":556},[455,890,891],{"class":560},"screen-length 0 temporary",[455,893,564],{"class":556},[455,895,896,899],{"class":457,"line":506},[455,897,898],{"class":461},"    inspect_commands",[455,900,866],{"class":465},[455,902,903,905,907,910],{"class":457,"line":517},[455,904,886],{"class":885},[455,906,557],{"class":556},[455,908,909],{"class":560},"display version",[455,911,564],{"class":556},[455,913,914,916,918,921],{"class":457,"line":528},[455,915,886],{"class":885},[455,917,557],{"class":556},[455,919,920],{"class":560},"display device",[455,922,564],{"class":556},[455,924,925,927,929,932],{"class":457,"line":538},[455,926,886],{"class":885},[455,928,557],{"class":556},[455,930,931],{"class":560},"display health",[455,933,564],{"class":556},[455,935,936,938,940,943],{"class":457,"line":548},[455,937,886],{"class":885},[455,939,557],{"class":556},[455,941,942],{"class":560},"display interface brief",[455,944,564],{"class":556},[455,946,947,949,951,954],{"class":457,"line":567},[455,948,886],{"class":885},[455,950,557],{"class":556},[455,952,953],{"class":560},"display vlan",[455,955,564],{"class":556},[455,957,959,961,963,966],{"class":457,"line":958},11,[455,960,886],{"class":885},[455,962,557],{"class":556},[455,964,965],{"class":560},"display mac-address",[455,967,564],{"class":556},[455,969,971,973,975,978],{"class":457,"line":970},12,[455,972,886],{"class":885},[455,974,557],{"class":556},[455,976,977],{"class":560},"display arp all",[455,979,564],{"class":556},[455,981,983,986],{"class":457,"line":982},13,[455,984,985],{"class":461},"    query_commands",[455,987,866],{"class":465},[455,989,991,994,996,998,1000],{"class":457,"line":990},14,[455,992,993],{"class":461},"      arp",[455,995,466],{"class":465},[455,997,557],{"class":556},[455,999,977],{"class":560},[455,1001,564],{"class":556},[455,1003,1005,1008,1010,1012,1014],{"class":457,"line":1004},15,[455,1006,1007],{"class":461},"      mac",[455,1009,466],{"class":465},[455,1011,557],{"class":556},[455,1013,965],{"class":560},[455,1015,564],{"class":556},[455,1017,1019,1022,1024,1026,1029],{"class":457,"line":1018},16,[455,1020,1021],{"class":461},"      interface",[455,1023,466],{"class":465},[455,1025,557],{"class":556},[455,1027,1028],{"class":560},"display interface {interface}",[455,1030,564],{"class":556},[581,1032,1033,1042],{},[584,1034,1035],{},[587,1036,1037,1040],{},[590,1038,1039],{},"节点",[590,1041,598],{},[600,1043,1044,1054,1064,1074,1084],{},[587,1045,1046,1051],{},[605,1047,1048],{},[441,1049,1050],{},"paging_disable",[605,1052,1053],{},"关闭分页，避免长回显等待交互。",[587,1055,1056,1061],{},[605,1057,1058],{},[441,1059,1060],{},"inspect_commands",[605,1062,1063],{},"每次巡检顺序执行的采集命令。",[587,1065,1066,1071],{},[605,1067,1068],{},[441,1069,1070],{},"query_commands.arp",[605,1072,1073],{},"ARP 查询命令。",[587,1075,1076,1081],{},[605,1077,1078],{},[441,1079,1080],{},"query_commands.mac",[605,1082,1083],{},"MAC 查询命令。",[587,1085,1086,1091],{},[605,1087,1088],{},[441,1089,1090],{},"query_commands.interface",[605,1092,1093,1094,773],{},"接口查询模板，必须保留 ",[441,1095,1096],{},"{interface}",[425,1098,1099],{"id":1099},"只读命令安全校验",[429,1101,1102],{},"程序只允许以下前缀：",[747,1104,1105,1111,1116],{},[750,1106,1107,1110],{},[441,1108,1109],{},"display","（后跟空格）",[750,1112,1113,1110],{},[441,1114,1115],{},"show",[750,1117,1118,1110],{},[441,1119,1120],{},"screen-length",[429,1122,1123],{},"并拒绝包含以下独立危险词的命令：",[433,1125,1128],{"className":1126,"code":1127,"language":438,"meta":439},[436],"current-configuration\nsaved-configuration\nsave\nreset\ndelete\nreboot\nshutdown\nundo\nsystem-view\nconfigure\n",[441,1129,1127],{"__ignoreMap":439},[429,1131,1132],{},"命令不符合规则时，巡检会在连接设备前直接拒绝执行。",[1134,1135,1137],"callout",{"type":1136},"warning",[429,1138,1139,1140,1143],{},"安全校验是最后一道防线，不是扩大账号权限的理由。修改 ",[441,1141,1142],{},"commands.yaml"," 前必须确认命令不会进入配置模式、改变运行状态或输出不应落盘的敏感配置。",[425,1145,1146],{"id":1146},"增加或适配命令",[429,1148,1149],{},"接入同平台不同型号时，推荐流程：",[1151,1152,1153,1156,1159,1174,1177,1180,1187],"ol",{},[750,1154,1155],{},"在测试设备上人工确认只读命令和回显。",[750,1157,1158],{},"复制现有 profile，并使用清晰的 profile 名称。",[750,1160,1161,1162,1165,1166,1169,1170,1173],{},"在 ",[441,1163,1164],{},"devices.yaml"," 中让 ",[441,1167,1168],{},"vendor"," 或 ",[441,1171,1172],{},"device_type"," 对应该 profile。",[750,1175,1176],{},"只添加安全校验允许的命令。",[750,1178,1179],{},"先巡检单台设备。",[750,1181,1182,1183,1186],{},"对比 ",[441,1184,1185],{},"raw\u002F"," 原始回显与 Excel 解析结果。",[750,1188,1189],{},"运行项目测试后再推广到全量设备。",[429,1191,1192],{},"项目现有纯函数测试不需要连接真实交换机：",[433,1194,1198],{"className":1195,"code":1196,"language":1197,"meta":439,"style":439},"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",[441,1199,1200],{"__ignoreMap":439},[455,1201,1202,1206],{"class":457,"line":458},[455,1203,1205],{"class":1204},"sCf0g","pytest",[455,1207,1209],{"class":1208},"s254i"," tests\u002F\n",[429,1211,1212,1213,1215,1216,1219],{},"需要支持全新厂商或完全不同的回显格式时，仅修改 ",[441,1214,1142],{}," 可能不够，还需要扩展 ",[441,1217,1218],{},"switch_ops\u002Fparser.py"," 的解析规则并补充测试。",[1221,1222,1223],"style",{},"html pre.shiki code .sBSHF, html code.shiki .sBSHF{--shiki-light:#22863A;--shiki-default:#22863A;--shiki-dark:#85E89D;--shiki-code-theme-vitesse-light:#998418;--shiki-code-theme-vitesse-dark:#B8A965;--shiki-code-theme-catppuccin-light:#1E66F5;--shiki-code-theme-catppuccin-dark:#89B4FA;--shiki-code-theme-one-light:#E45649;--shiki-code-theme-one-dark:#E06C75;--shiki-code-theme-material-light:#E53935;--shiki-code-theme-material-dark:#F07178;--shiki-code-theme-min-light:#D32F2F;--shiki-code-theme-min-dark:#F8F8F8}html pre.shiki code .stNAY, html code.shiki .stNAY{--shiki-light:#24292E;--shiki-default:#24292E;--shiki-dark:#E1E4E8;--shiki-code-theme-vitesse-light:#999999;--shiki-code-theme-vitesse-dark:#666666;--shiki-code-theme-catppuccin-light:#179299;--shiki-code-theme-catppuccin-dark:#94E2D5;--shiki-code-theme-one-light:#383A42;--shiki-code-theme-one-dark:#ABB2BF;--shiki-code-theme-material-light:#39ADB5;--shiki-code-theme-material-dark:#89DDFF;--shiki-code-theme-min-light:#D32F2F;--shiki-code-theme-min-dark:#F97583}html pre.shiki code .s_Zq6, html code.shiki .s_Zq6{--shiki-light:#005CC5;--shiki-default:#005CC5;--shiki-dark:#79B8FF;--shiki-code-theme-vitesse-light:#2F798A;--shiki-code-theme-vitesse-dark:#4C9A91;--shiki-code-theme-catppuccin-light:#FE640B;--shiki-code-theme-catppuccin-dark:#FAB387;--shiki-code-theme-one-light:#986801;--shiki-code-theme-one-dark:#D19A66;--shiki-code-theme-material-light:#F76D47;--shiki-code-theme-material-dark:#F78C6C;--shiki-code-theme-min-light:#1976D2;--shiki-code-theme-min-dark:#F8F8F8}html pre.shiki code .sLXf0, html code.shiki .sLXf0{--shiki-light:#032F62;--shiki-default:#032F62;--shiki-dark:#9ECBFF;--shiki-code-theme-vitesse-light:#B5695977;--shiki-code-theme-vitesse-dark:#C98A7D77;--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:#39ADB5;--shiki-code-theme-material-dark:#89DDFF;--shiki-code-theme-min-light:#22863A;--shiki-code-theme-min-dark:#FFAB70}html pre.shiki code .sCtJb, html code.shiki .sCtJb{--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:#22863A;--shiki-code-theme-min-dark:#FFAB70}html pre.shiki code .sle2E, html code.shiki .sle2E{--shiki-light:#005CC5;--shiki-default:#005CC5;--shiki-dark:#79B8FF;--shiki-code-theme-vitesse-light:#1E754F;--shiki-code-theme-vitesse-dark:#4D9375;--shiki-code-theme-catppuccin-light:#FE640B;--shiki-code-theme-catppuccin-dark:#FAB387;--shiki-code-theme-one-light:#986801;--shiki-code-theme-one-dark:#D19A66;--shiki-code-theme-material-light:#FF5370;--shiki-code-theme-material-dark:#FF9CAC;--shiki-code-theme-min-light:#1976D2;--shiki-code-theme-min-dark:#79B8FF}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);}html pre.shiki code .sIQTy, html code.shiki .sIQTy{--shiki-light:#24292E;--shiki-default:#24292E;--shiki-dark:#E1E4E8;--shiki-code-theme-vitesse-light:#999999;--shiki-code-theme-vitesse-dark:#666666;--shiki-code-theme-catppuccin-light:#7C7F93;--shiki-code-theme-catppuccin-dark:#9399B2;--shiki-code-theme-one-light:#383A42;--shiki-code-theme-one-dark:#ABB2BF;--shiki-code-theme-material-light:#39ADB5;--shiki-code-theme-material-dark:#89DDFF;--shiki-code-theme-min-light:#24292EFF;--shiki-code-theme-min-dark:#B392F0}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}",{"title":439,"searchDepth":473,"depth":473,"links":1225},[1226,1227,1228,1229,1230,1231,1232,1233],{"id":427,"depth":473,"text":427},{"id":579,"depth":473,"text":579},{"id":742,"depth":473,"text":742},{"id":776,"depth":473,"text":776},{"id":814,"depth":473,"text":814},{"id":841,"depth":473,"text":841},{"id":1099,"depth":473,"text":1099},{"id":1146,"depth":473,"text":1146},"调整 SwitchOps 的并发、重试、超时、告警阈值、输出位置和厂商命令模板。","md",{},{"icon":221},"---\ntitle: 高级配置\ndescription: 调整 SwitchOps 的并发、重试、超时、告警阈值、输出位置和厂商命令模板。\nupdated: 2026-09-04\nnavigation:\n  icon: lucide:settings\n---\n\n## 全局设置\n\n全局配置文件为：\n\n```text\nconfig\u002Fsettings.yaml\n```\n\n默认内容：\n\n```yaml [config\u002Fsettings.yaml]\nconcurrency: 5\nretry_times: 2\nconn_timeout: 20\ncommand_timeout: 60\ncpu_warn_threshold: 80\ncpu_critical_threshold: 90\nmemory_warn_threshold: 80\nmemory_critical_threshold: 90\noutput_root: \"outputs\"\ndb_enabled: true\n```\n\n## 设置项说明\n\n| 设置 | 默认值 | 作用 |\n| --- | --- | --- |\n| `concurrency` | `5` | 同时巡检的最大设备数。 |\n| `retry_times` | `2` | 首次失败后的重试次数；默认最多尝试 3 次。 |\n| `conn_timeout` | `20` | SSH 连接、认证、Banner 和基础会话超时秒数。 |\n| `command_timeout` | `60` | 单条交换机命令的读取超时秒数。 |\n| `cpu_warn_threshold` | `80` | CPU 大于该值时标记关注。 |\n| `cpu_critical_threshold` | `90` | CPU 大于等于该值时标记异常。 |\n| `memory_warn_threshold` | `80` | 内存大于该值时标记关注。 |\n| `memory_critical_threshold` | `90` | 内存大于等于该值时标记异常。 |\n| `output_root` | `outputs` | 报告、日志、查询和历史库的根目录。 |\n| `db_enabled` | `true` | 是否保存 SQLite 历史记录。 |\n\n## 调整并发和超时\n\n大型网络不要直接把并发数调得很高。需要同时考虑：\n\n- 管理电脑 CPU、内存和网络能力；\n- 核心交换机允许的 SSH 并发会话数；\n- 防火墙、堡垒机或准入设备的连接限制；\n- 低性能接入交换机处理 CLI 命令的速度。\n\n建议从 `5` 开始，小规模验证后逐步调整。跨区域链路延迟较大时，可以适当增加 `conn_timeout`；MAC 地址表较大或设备回显较慢时，可以增加 `command_timeout`。\n\n## 修改输出目录\n\n使用绝对路径：\n\n```yaml\noutput_root: \"D:\u002FSwitchOpsData\"\n```\n\n使用相对路径时，路径相对于程序根目录：\n\n- 源码运行：项目根目录。\n- EXE 运行：EXE 所在目录。\n\n输出目录必须允许当前 Windows 用户创建目录和文件。\n\n## 关闭历史库\n\n只需要当次 Excel，不需要长期趋势时：\n\n```yaml\ndb_enabled: false\n```\n\n已有的 `outputs\u002Fhistory.db` 不会被删除，只是后续巡检不再写入。\n\n## 厂商命令模板\n\n命令配置位于：\n\n```text\nconfig\u002Fcommands.yaml\n```\n\n每个 profile 包含：\n\n```yaml\nprofiles:\n  huawei:\n    paging_disable:\n      - \"screen-length 0 temporary\"\n    inspect_commands:\n      - \"display version\"\n      - \"display device\"\n      - \"display health\"\n      - \"display interface brief\"\n      - \"display vlan\"\n      - \"display mac-address\"\n      - \"display arp all\"\n    query_commands:\n      arp: \"display arp all\"\n      mac: \"display mac-address\"\n      interface: \"display interface {interface}\"\n```\n\n| 节点 | 作用 |\n| --- | --- |\n| `paging_disable` | 关闭分页，避免长回显等待交互。 |\n| `inspect_commands` | 每次巡检顺序执行的采集命令。 |\n| `query_commands.arp` | ARP 查询命令。 |\n| `query_commands.mac` | MAC 查询命令。 |\n| `query_commands.interface` | 接口查询模板，必须保留 `{interface}`。 |\n\n## 只读命令安全校验\n\n程序只允许以下前缀：\n\n- `display`（后跟空格）\n- `show`（后跟空格）\n- `screen-length`（后跟空格）\n\n并拒绝包含以下独立危险词的命令：\n\n```text\ncurrent-configuration\nsaved-configuration\nsave\nreset\ndelete\nreboot\nshutdown\nundo\nsystem-view\nconfigure\n```\n\n命令不符合规则时，巡检会在连接设备前直接拒绝执行。\n\n::callout{type=\"warning\"}\n安全校验是最后一道防线，不是扩大账号权限的理由。修改 `commands.yaml` 前必须确认命令不会进入配置模式、改变运行状态或输出不应落盘的敏感配置。\n::\n\n## 增加或适配命令\n\n接入同平台不同型号时，推荐流程：\n\n1. 在测试设备上人工确认只读命令和回显。\n2. 复制现有 profile，并使用清晰的 profile 名称。\n3. 在 `devices.yaml` 中让 `vendor` 或 `device_type` 对应该 profile。\n4. 只添加安全校验允许的命令。\n5. 先巡检单台设备。\n6. 对比 `raw\u002F` 原始回显与 Excel 解析结果。\n7. 运行项目测试后再推广到全量设备。\n\n项目现有纯函数测试不需要连接真实交换机：\n\n```bash\npytest tests\u002F\n```\n\n需要支持全新厂商或完全不同的回显格式时，仅修改 `commands.yaml` 可能不够，还需要扩展 `switch_ops\u002Fparser.py` 的解析规则并补充测试。\n",{"title":218,"description":1234},"2026-09-04","lzta8e3uLl8f3fnm1HrJk6krW_5Uk0DaMTvF5_dfzMI",[1243,1245],{"title":213,"path":214,"stem":215,"description":1244,"icon":216,"children":-1},"了解原始回显、Excel 巡检报告、失败清单、端口台账和 SQLite 历史库。",{"title":223,"path":224,"stem":225,"description":1246,"icon":226,"children":-1},"使用 PyInstaller 构建 SwitchOps 单文件 EXE，并按推荐目录交付配置和输出数据。",1791307034299]