[{"data":1,"prerenderedAt":1153},["ShallowReactive",2],{"navigation":3,"blogNavigation":232,"page-\u002Fdocs\u002Fswitchops%E4%BA%A4%E6%8D%A2%E6%9C%BA%E5%B7%A1%E6%A3%80\u002Fquick-start":418,"\u002Fdocs\u002Fswitchops%E4%BA%A4%E6%8D%A2%E6%9C%BA%E5%B7%A1%E6%A3%80\u002Fquick-start-surround":1148},[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":193,"badges":420,"body":421,"date":420,"description":1140,"draft":57,"extension":1141,"fullpage":57,"icon":420,"links":420,"meta":1142,"navBadges":420,"navigation":1143,"path":194,"rawbody":1144,"seo":1145,"stem":195,"updated":1146,"__hash__":1147},"docs\u002Fdocs\u002F3.SwitchOps交换机巡检\u002F2.quick-start.md",null,{"type":422,"value":423,"toc":1126},"minimark",[424,428,432,483,486,489,520,523,558,561,564,569,598,601,616,620,683,686,689,696,725,731,934,941,954,958,961,970,973,991,994,1007,1010,1022,1025,1048,1052,1079,1082,1085,1088,1096,1099,1122],[425,426,427],"h2",{"id":427},"运行方式",[429,430,431],"p",{},"SwitchOps 提供两种运行方式：",[433,434,435,451],"table",{},[436,437,438],"thead",{},[439,440,441,445,448],"tr",{},[442,443,444],"th",{},"方式",[442,446,447],{},"适合人群",[442,449,450],{},"入口",[452,453,454,470],"tbody",{},[439,455,456,460,463],{},[457,458,459],"td",{},"图形界面",[457,461,462],{},"日常值班和一线运维人员",[457,464,465,469],{},[466,467,468],"code",{},"python main.py"," 或打包后的 EXE",[439,471,472,475,478],{},[457,473,474],{},"命令行",[457,476,477],{},"开发调试、脚本调用和批处理",[457,479,480],{},[466,481,482],{},"python cli.py ...",[429,484,485],{},"第一次使用建议先用源码运行 GUI，确认设备配置和 SSH 连接正常后，再考虑打包为 Windows EXE。",[425,487,488],{"id":488},"环境要求",[490,491,492,496,499,506,517],"ul",{},[493,494,495],"li",{},"Python 3.10 或更高版本。",[493,497,498],{},"可以访问交换机管理 IP 的 Windows、macOS 或 Linux 电脑。",[493,500,501,502,505],{},"交换机已经启用 SSH，默认端口为 ",[466,503,504],{},"22","。",[493,507,508,509,512,513,516],{},"巡检账号能够执行所需的 ",[466,510,511],{},"display"," 或 ",[466,514,515],{},"show"," 查询命令。",[493,518,519],{},"Windows 打包 EXE 时需要 PyInstaller，项目依赖中已经包含。",[425,521,522],{"id":522},"获取源码",[524,525,530],"pre",{"className":526,"code":527,"language":528,"meta":529,"style":529},"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","git clone https:\u002F\u002Fgit.95669.com\u002Fdnxk\u002Fswitch-ops-netmiko.git\ncd switch-ops-netmiko\n","bash","",[466,531,532,548],{"__ignoreMap":529},[533,534,537,541,545],"span",{"class":535,"line":536},"line",1,[533,538,540],{"class":539},"sCf0g","git",[533,542,544],{"class":543},"s254i"," clone",[533,546,547],{"class":543}," https:\u002F\u002Fgit.95669.com\u002Fdnxk\u002Fswitch-ops-netmiko.git\n",[533,549,551,555],{"class":535,"line":550},2,[533,552,554],{"class":553},"s7wrB","cd",[533,556,557],{"class":543}," switch-ops-netmiko\n",[429,559,560],{},"如果代码通过其他开源镜像分发，也可以直接下载源码压缩包并解压到本地目录。",[425,562,563],{"id":563},"创建虚拟环境并安装依赖",[565,566,568],"h3",{"id":567},"windows-powershell","Windows PowerShell",[524,570,574],{"className":571,"code":572,"language":573,"meta":529,"style":529},"language-powershell 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","py -3 -m venv .venv\n.\\.venv\\Scripts\\Activate.ps1\npython -m pip install --upgrade pip\npython -m pip install -r requirements.txt\n","powershell",[466,575,576,581,586,592],{"__ignoreMap":529},[533,577,578],{"class":535,"line":536},[533,579,580],{},"py -3 -m venv .venv\n",[533,582,583],{"class":535,"line":550},[533,584,585],{},".\\.venv\\Scripts\\Activate.ps1\n",[533,587,589],{"class":535,"line":588},3,[533,590,591],{},"python -m pip install --upgrade pip\n",[533,593,595],{"class":535,"line":594},4,[533,596,597],{},"python -m pip install -r requirements.txt\n",[429,599,600],{},"如果 PowerShell 阻止激活脚本，可以直接使用虚拟环境中的 Python：",[524,602,604],{"className":571,"code":603,"language":573,"meta":529,"style":529},".\\.venv\\Scripts\\python.exe -m pip install -r requirements.txt\n.\\.venv\\Scripts\\python.exe main.py\n",[466,605,606,611],{"__ignoreMap":529},[533,607,608],{"class":535,"line":536},[533,609,610],{},".\\.venv\\Scripts\\python.exe -m pip install -r requirements.txt\n",[533,612,613],{"class":535,"line":550},[533,614,615],{},".\\.venv\\Scripts\\python.exe main.py\n",[565,617,619],{"id":618},"macos-或-linux","macOS 或 Linux",[524,621,623],{"className":526,"code":622,"language":528,"meta":529,"style":529},"python3 -m venv .venv\nsource .venv\u002Fbin\u002Factivate\npython -m pip install --upgrade pip\npython -m pip install -r requirements.txt\n",[466,624,625,640,648,667],{"__ignoreMap":529},[533,626,627,630,634,637],{"class":535,"line":536},[533,628,629],{"class":539},"python3",[533,631,633],{"class":632},"scmvv"," -m",[533,635,636],{"class":543}," venv",[533,638,639],{"class":543}," .venv\n",[533,641,642,645],{"class":535,"line":550},[533,643,644],{"class":553},"source",[533,646,647],{"class":543}," .venv\u002Fbin\u002Factivate\n",[533,649,650,653,655,658,661,664],{"class":535,"line":588},[533,651,652],{"class":539},"python",[533,654,633],{"class":632},[533,656,657],{"class":543}," pip",[533,659,660],{"class":543}," install",[533,662,663],{"class":632}," --upgrade",[533,665,666],{"class":543}," pip\n",[533,668,669,671,673,675,677,680],{"class":535,"line":594},[533,670,652],{"class":539},[533,672,633],{"class":632},[533,674,657],{"class":543},[533,676,660],{"class":543},[533,678,679],{"class":632}," -r",[533,681,682],{"class":543}," requirements.txt\n",[429,684,685],{},"Linux 如果缺少 Tkinter，需要使用系统包管理器安装对应的 Tk 支持；只使用 CLI 时不需要打开图形界面。",[425,687,688],{"id":688},"创建设备配置",[429,690,691,692,695],{},"真实设备清单使用 ",[466,693,694],{},"config\u002Fdevices.yaml","。先复制示例文件：",[697,698,699,708],"code-group",{},[524,700,702],{"className":571,"code":701,"filename":568,"language":573,"meta":529,"style":529},"Copy-Item config\\devices.example.yaml config\\devices.yaml\n",[466,703,704],{"__ignoreMap":529},[533,705,706],{"class":535,"line":536},[533,707,701],{},[524,709,712],{"className":526,"code":710,"filename":711,"language":528,"meta":529,"style":529},"cp config\u002Fdevices.example.yaml config\u002Fdevices.yaml\n","macOS \u002F Linux",[466,713,714],{"__ignoreMap":529},[533,715,716,719,722],{"class":535,"line":536},[533,717,718],{"class":539},"cp",[533,720,721],{"class":543}," config\u002Fdevices.example.yaml",[533,723,724],{"class":543}," config\u002Fdevices.yaml\n",[429,726,727,728,730],{},"打开 ",[466,729,694],{},"，先保留一台测试交换机并填写真实信息：",[524,732,736],{"className":733,"code":734,"filename":694,"language":735,"meta":529,"style":529},"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","devices:\n  - name: \"测试交换机\"\n    host: \"192.168.1.1\"\n    port: 22\n    vendor: \"huawei\"\n    model: \"S5720\"\n    device_type: \"huawei\"\n    username: \"inspect_user\"\n    password: \"请替换为真实密码\"\n    secret: \"\"\n    need_super: false\n    role: \"access\"\n    location: \"一楼弱电间\"\n    enabled: true\n","yaml",[466,737,738,748,771,785,796,811,826,840,855,870,881,893,908,923],{"__ignoreMap":529},[533,739,740,744],{"class":535,"line":536},[533,741,743],{"class":742},"sBSHF","devices",[533,745,747],{"class":746},"stNAY",":\n",[533,749,750,754,757,760,764,768],{"class":535,"line":550},[533,751,753],{"class":752},"sIQTy","  -",[533,755,756],{"class":742}," name",[533,758,759],{"class":746},":",[533,761,763],{"class":762},"sLXf0"," \"",[533,765,767],{"class":766},"sCtJb","测试交换机",[533,769,770],{"class":762},"\"\n",[533,772,773,776,778,780,783],{"class":535,"line":588},[533,774,775],{"class":742},"    host",[533,777,759],{"class":746},[533,779,763],{"class":762},[533,781,782],{"class":766},"192.168.1.1",[533,784,770],{"class":762},[533,786,787,790,792],{"class":535,"line":594},[533,788,789],{"class":742},"    port",[533,791,759],{"class":746},[533,793,795],{"class":794},"s_Zq6"," 22\n",[533,797,799,802,804,806,809],{"class":535,"line":798},5,[533,800,801],{"class":742},"    vendor",[533,803,759],{"class":746},[533,805,763],{"class":762},[533,807,808],{"class":766},"huawei",[533,810,770],{"class":762},[533,812,814,817,819,821,824],{"class":535,"line":813},6,[533,815,816],{"class":742},"    model",[533,818,759],{"class":746},[533,820,763],{"class":762},[533,822,823],{"class":766},"S5720",[533,825,770],{"class":762},[533,827,829,832,834,836,838],{"class":535,"line":828},7,[533,830,831],{"class":742},"    device_type",[533,833,759],{"class":746},[533,835,763],{"class":762},[533,837,808],{"class":766},[533,839,770],{"class":762},[533,841,843,846,848,850,853],{"class":535,"line":842},8,[533,844,845],{"class":742},"    username",[533,847,759],{"class":746},[533,849,763],{"class":762},[533,851,852],{"class":766},"inspect_user",[533,854,770],{"class":762},[533,856,858,861,863,865,868],{"class":535,"line":857},9,[533,859,860],{"class":742},"    password",[533,862,759],{"class":746},[533,864,763],{"class":762},[533,866,867],{"class":766},"请替换为真实密码",[533,869,770],{"class":762},[533,871,873,876,878],{"class":535,"line":872},10,[533,874,875],{"class":742},"    secret",[533,877,759],{"class":746},[533,879,880],{"class":762}," \"\"\n",[533,882,884,887,889],{"class":535,"line":883},11,[533,885,886],{"class":742},"    need_super",[533,888,759],{"class":746},[533,890,892],{"class":891},"sle2E"," false\n",[533,894,896,899,901,903,906],{"class":535,"line":895},12,[533,897,898],{"class":742},"    role",[533,900,759],{"class":746},[533,902,763],{"class":762},[533,904,905],{"class":766},"access",[533,907,770],{"class":762},[533,909,911,914,916,918,921],{"class":535,"line":910},13,[533,912,913],{"class":742},"    location",[533,915,759],{"class":746},[533,917,763],{"class":762},[533,919,920],{"class":766},"一楼弱电间",[533,922,770],{"class":762},[533,924,926,929,931],{"class":535,"line":925},14,[533,927,928],{"class":742},"    enabled",[533,930,759],{"class":746},[533,932,933],{"class":891}," true\n",[429,935,936,937,505],{},"完整字段说明见",[938,939,198],"a",{"href":940},"\u002Fdocs\u002Fswitchops%E4%BA%A4%E6%8D%A2%E6%9C%BA%E5%B7%A1%E6%A3%80\u002Fdevice-config",[942,943,945],"callout",{"type":944},"warning",[429,946,947,949,950,953],{},[466,948,694],{}," 包含真实账号密码，已经被项目的 ",[466,951,952],{},".gitignore"," 忽略。不要把它提交到 Git、发送到公共群聊或打包进公开发布物。",[425,955,957],{"id":956},"检查网络和-ssh","检查网络和 SSH",[429,959,960],{},"在 Windows PowerShell 中确认管理地址和 SSH 端口可达：",[524,962,964],{"className":571,"code":963,"language":573,"meta":529,"style":529},"Test-NetConnection 192.168.1.1 -Port 22\n",[466,965,966],{"__ignoreMap":529},[533,967,968],{"class":535,"line":536},[533,969,963],{},[429,971,972],{},"在 macOS 或 Linux 中可以使用：",[524,974,976],{"className":526,"code":975,"language":528,"meta":529,"style":529},"nc -vz 192.168.1.1 22\n",[466,977,978],{"__ignoreMap":529},[533,979,980,983,986,989],{"class":535,"line":536},[533,981,982],{"class":539},"nc",[533,984,985],{"class":632}," -vz",[533,987,988],{"class":794}," 192.168.1.1",[533,990,795],{"class":794},[429,992,993],{},"端口可达并不代表账号一定可用。建议先用系统 SSH 客户端登录一次，确认账号、密码和权限：",[524,995,997],{"className":526,"code":996,"language":528,"meta":529,"style":529},"ssh inspect_user@192.168.1.1\n",[466,998,999],{"__ignoreMap":529},[533,1000,1001,1004],{"class":535,"line":536},[533,1002,1003],{"class":539},"ssh",[533,1005,1006],{"class":543}," inspect_user@192.168.1.1\n",[425,1008,1009],{"id":1009},"启动图形界面",[524,1011,1013],{"className":526,"code":1012,"language":528,"meta":529,"style":529},"python main.py\n",[466,1014,1015],{"__ignoreMap":529},[533,1016,1017,1019],{"class":535,"line":536},[533,1018,652],{"class":539},[533,1020,1021],{"class":543}," main.py\n",[429,1023,1024],{},"在窗口中依次完成：",[1026,1027,1028,1033,1036,1039,1042,1045],"ol",{},[493,1029,1030,1031,505],{},"确认“配置文件”指向 ",[466,1032,694],{},[493,1034,1035],{},"点击“加载设备”，检查名称、IP、厂商和状态是否正确。",[493,1037,1038],{},"首次测试只勾选一台非核心设备。",[493,1040,1041],{},"点击“巡检选中设备”。",[493,1043,1044],{},"观察进度和日志，等待完成提示。",[493,1046,1047],{},"点击“打开输出目录”查看报告。",[425,1049,1051],{"id":1050},"使用-cli-完成首次巡检","使用 CLI 完成首次巡检",[524,1053,1055],{"className":526,"code":1054,"language":528,"meta":529,"style":529},"python cli.py inspect --config config\u002Fdevices.yaml --target 192.168.1.1\n",[466,1056,1057],{"__ignoreMap":529},[533,1058,1059,1061,1064,1067,1070,1073,1076],{"class":535,"line":536},[533,1060,652],{"class":539},[533,1062,1063],{"class":543}," cli.py",[533,1065,1066],{"class":543}," inspect",[533,1068,1069],{"class":632}," --config",[533,1071,1072],{"class":543}," config\u002Fdevices.yaml",[533,1074,1075],{"class":632}," --target",[533,1077,1078],{"class":794}," 192.168.1.1\n",[429,1080,1081],{},"执行完成后会显示成功数、失败数和 Excel 报告路径。",[425,1083,1084],{"id":1084},"检查输出",[429,1086,1087],{},"默认输出位于：",[524,1089,1094],{"className":1090,"code":1092,"language":1093,"meta":529},[1091],"language-text","outputs\u002F\n├── history.db\n└── YYYY-MM-DD\u002F\n    ├── logs\u002F\n    │   └── app.log\n    ├── queries\u002F\n    ├── raw\u002F\n    │   └── 测试交换机_192.168.1.1.txt\n    └── reports\u002F\n        └── 巡检汇总_YYYY-MM-DD_HHMMSS.xlsx\n","text",[466,1095,1092],{"__ignoreMap":529},[429,1097,1098],{},"第一次运行后建议检查：",[490,1100,1101,1107,1110,1116],{},[493,1102,1103,1106],{},[466,1104,1105],{},"raw\u002F"," 中是否保存了每条巡检命令的原始回显。",[493,1108,1109],{},"Excel 中设备名称、版本、CPU、内存和接口数据是否符合设备实际情况。",[493,1111,1112,1115],{},[466,1113,1114],{},"logs\u002Fapp.log"," 中是否存在命令超时、权限不足或解析关注项。",[493,1117,1118,1121],{},[466,1119,1120],{},"outputs\u002Fhistory.db"," 是否已经生成。",[1123,1124,1125],"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 pre.shiki code .s7wrB, html code.shiki .s7wrB{--shiki-light:#005CC5;--shiki-light-font-style:inherit;--shiki-default:#005CC5;--shiki-default-font-style:inherit;--shiki-dark:#79B8FF;--shiki-dark-font-style:inherit;--shiki-code-theme-vitesse-light:#998418;--shiki-code-theme-vitesse-light-font-style:inherit;--shiki-code-theme-vitesse-dark:#B8A965;--shiki-code-theme-vitesse-dark-font-style:inherit;--shiki-code-theme-catppuccin-light:#D20F39;--shiki-code-theme-catppuccin-light-font-style:italic;--shiki-code-theme-catppuccin-dark:#F38BA8;--shiki-code-theme-catppuccin-dark-font-style:italic;--shiki-code-theme-one-light:#0184BC;--shiki-code-theme-one-light-font-style:inherit;--shiki-code-theme-one-dark:#56B6C2;--shiki-code-theme-one-dark-font-style:inherit;--shiki-code-theme-material-light:#6182B8;--shiki-code-theme-material-light-font-style:inherit;--shiki-code-theme-material-dark:#82AAFF;--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 .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 .scmvv, html code.shiki .scmvv{--shiki-light:#005CC5;--shiki-default:#005CC5;--shiki-dark:#79B8FF;--shiki-code-theme-vitesse-light:#A65E2B;--shiki-code-theme-vitesse-dark:#C99076;--shiki-code-theme-catppuccin-light:#40A02B;--shiki-code-theme-catppuccin-dark:#A6E3A1;--shiki-code-theme-one-light:#986801;--shiki-code-theme-one-dark:#D19A66;--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 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 .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 .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 .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 .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}",{"title":529,"searchDepth":550,"depth":550,"links":1127},[1128,1129,1130,1131,1135,1136,1137,1138,1139],{"id":427,"depth":550,"text":427},{"id":488,"depth":550,"text":488},{"id":522,"depth":550,"text":522},{"id":563,"depth":550,"text":563,"children":1132},[1133,1134],{"id":567,"depth":588,"text":568},{"id":618,"depth":588,"text":619},{"id":688,"depth":550,"text":688},{"id":956,"depth":550,"text":957},{"id":1009,"depth":550,"text":1009},{"id":1050,"depth":550,"text":1051},{"id":1084,"depth":550,"text":1084},"从获取源码、安装 Python 依赖到完成第一次交换机巡检。","md",{},{"icon":196},"---\ntitle: 快速开始\ndescription: 从获取源码、安装 Python 依赖到完成第一次交换机巡检。\nupdated: 2026-09-04\nnavigation:\n  icon: lucide:rocket\n---\n\n## 运行方式\n\nSwitchOps 提供两种运行方式：\n\n| 方式 | 适合人群 | 入口 |\n| --- | --- | --- |\n| 图形界面 | 日常值班和一线运维人员 | `python main.py` 或打包后的 EXE |\n| 命令行 | 开发调试、脚本调用和批处理 | `python cli.py ...` |\n\n第一次使用建议先用源码运行 GUI，确认设备配置和 SSH 连接正常后，再考虑打包为 Windows EXE。\n\n## 环境要求\n\n- Python 3.10 或更高版本。\n- 可以访问交换机管理 IP 的 Windows、macOS 或 Linux 电脑。\n- 交换机已经启用 SSH，默认端口为 `22`。\n- 巡检账号能够执行所需的 `display` 或 `show` 查询命令。\n- Windows 打包 EXE 时需要 PyInstaller，项目依赖中已经包含。\n\n## 获取源码\n\n```bash\ngit clone https:\u002F\u002Fgit.95669.com\u002Fdnxk\u002Fswitch-ops-netmiko.git\ncd switch-ops-netmiko\n```\n\n如果代码通过其他开源镜像分发，也可以直接下载源码压缩包并解压到本地目录。\n\n## 创建虚拟环境并安装依赖\n\n### Windows PowerShell\n\n```powershell\npy -3 -m venv .venv\n.\\.venv\\Scripts\\Activate.ps1\npython -m pip install --upgrade pip\npython -m pip install -r requirements.txt\n```\n\n如果 PowerShell 阻止激活脚本，可以直接使用虚拟环境中的 Python：\n\n```powershell\n.\\.venv\\Scripts\\python.exe -m pip install -r requirements.txt\n.\\.venv\\Scripts\\python.exe main.py\n```\n\n### macOS 或 Linux\n\n```bash\npython3 -m venv .venv\nsource .venv\u002Fbin\u002Factivate\npython -m pip install --upgrade pip\npython -m pip install -r requirements.txt\n```\n\nLinux 如果缺少 Tkinter，需要使用系统包管理器安装对应的 Tk 支持；只使用 CLI 时不需要打开图形界面。\n\n## 创建设备配置\n\n真实设备清单使用 `config\u002Fdevices.yaml`。先复制示例文件：\n\n::code-group\n```powershell [Windows PowerShell]\nCopy-Item config\\devices.example.yaml config\\devices.yaml\n```\n\n```bash [macOS \u002F Linux]\ncp config\u002Fdevices.example.yaml config\u002Fdevices.yaml\n```\n::\n\n打开 `config\u002Fdevices.yaml`，先保留一台测试交换机并填写真实信息：\n\n```yaml [config\u002Fdevices.yaml]\ndevices:\n  - name: \"测试交换机\"\n    host: \"192.168.1.1\"\n    port: 22\n    vendor: \"huawei\"\n    model: \"S5720\"\n    device_type: \"huawei\"\n    username: \"inspect_user\"\n    password: \"请替换为真实密码\"\n    secret: \"\"\n    need_super: false\n    role: \"access\"\n    location: \"一楼弱电间\"\n    enabled: true\n```\n\n完整字段说明见[设备清单配置](\u002Fdocs\u002Fswitchops交换机巡检\u002Fdevice-config)。\n\n::callout{type=\"warning\"}\n`config\u002Fdevices.yaml` 包含真实账号密码，已经被项目的 `.gitignore` 忽略。不要把它提交到 Git、发送到公共群聊或打包进公开发布物。\n::\n\n## 检查网络和 SSH\n\n在 Windows PowerShell 中确认管理地址和 SSH 端口可达：\n\n```powershell\nTest-NetConnection 192.168.1.1 -Port 22\n```\n\n在 macOS 或 Linux 中可以使用：\n\n```bash\nnc -vz 192.168.1.1 22\n```\n\n端口可达并不代表账号一定可用。建议先用系统 SSH 客户端登录一次，确认账号、密码和权限：\n\n```bash\nssh inspect_user@192.168.1.1\n```\n\n## 启动图形界面\n\n```bash\npython main.py\n```\n\n在窗口中依次完成：\n\n1. 确认“配置文件”指向 `config\u002Fdevices.yaml`。\n2. 点击“加载设备”，检查名称、IP、厂商和状态是否正确。\n3. 首次测试只勾选一台非核心设备。\n4. 点击“巡检选中设备”。\n5. 观察进度和日志，等待完成提示。\n6. 点击“打开输出目录”查看报告。\n\n## 使用 CLI 完成首次巡检\n\n```bash\npython cli.py inspect --config config\u002Fdevices.yaml --target 192.168.1.1\n```\n\n执行完成后会显示成功数、失败数和 Excel 报告路径。\n\n## 检查输出\n\n默认输出位于：\n\n```text\noutputs\u002F\n├── history.db\n└── YYYY-MM-DD\u002F\n    ├── logs\u002F\n    │   └── app.log\n    ├── queries\u002F\n    ├── raw\u002F\n    │   └── 测试交换机_192.168.1.1.txt\n    └── reports\u002F\n        └── 巡检汇总_YYYY-MM-DD_HHMMSS.xlsx\n```\n\n第一次运行后建议检查：\n\n- `raw\u002F` 中是否保存了每条巡检命令的原始回显。\n- Excel 中设备名称、版本、CPU、内存和接口数据是否符合设备实际情况。\n- `logs\u002Fapp.log` 中是否存在命令超时、权限不足或解析关注项。\n- `outputs\u002Fhistory.db` 是否已经生成。\n",{"title":193,"description":1140},"2026-09-04","QYTsYEaazGD6-igvYfEutQ6WFFGKjb4TrHIvLLD6MIQ",[1149,1151],{"title":190,"path":186,"stem":187,"description":1150,"icon":191,"children":-1},"认识 SwitchOps 交换机自动化巡检工具的功能、适用场景、工作流程和安全边界。",{"title":198,"path":199,"stem":200,"description":1152,"icon":201,"children":-1},"配置 devices.yaml 中的交换机连接信息、设备类型、启停状态和重点接口。",1791307033661]