Communitygithub.com

netmiko-ssh-automation

安全的 Python Netmiko 模式,適用於唯讀收集、批次 SSH、TextFSM 解析、受保護的配置變更、超時處理及網路自動化錯誤處理。在自動化網路設備存取時使用本技能,無論是收集狀態還是推送受保護的配置變更。

netmiko-ssh-automation 是什麼?

此技能提供了一套安全且經過實戰驗證的 Netmiko 模式,用於自動化網路設備的 SSH 存取。其核心設計理念是「預設唯讀」,要求所有配置變更都必須經過明確的批准、同儕審查和回滾計劃。技能涵蓋了唯讀連線、批次收集、TextFSM 結構化解析、受保護的配置推送以及全面的錯誤處理等模式。支援的平台包括 Cisco IOS、路由器、交換機和防火牆等任何 Netmiko 支援的裝置。通過強制使用環境變數或 vault 管理憑證、設置連線和讀取超時、限制並發執行緒數、以及將配置變更與 save_config() 分離等安全預設,有效防止了常見的自動化事故。

相容平台~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/affaan-m/ECC/tree/main/skills/netmiko-ssh-automation

在你喜歡的 AI 中提問

開啟一個已預先載入此 Agent Skill 的新對話。

說明文件

Netmiko SSH 自動化

當您編寫或審查使用 Netmiko 連接到網路裝置的 Python 自動化腳本時,請使用此技能。保持預設路徑為唯讀;配置變更需要單獨的變更窗口、同儕審查和回滾計劃。

使用時機

  • 收集路由器、交換機或防火牆的 show 指令輸出。
  • 為介面、路由或配置證據建立小型稽核腳本。
  • 為網路 SSH 腳本添加超時處理和例外處理。
  • 當範本存在時,使用 TextFSM 解析指令輸出。
  • 在腳本接觸正式環境裝置之前進行審查。

安全預設

  • 從唯讀的 send_command() 收集開始。
  • 保持庫存規模小且明確;不要掃描整個 IP 範圍。
  • 使用環境變數、vault 或 getpass;絕不硬編碼憑證。
  • 設定連線和讀取超時。
  • 限制並發執行緒數,以免老舊裝置過載。
  • 在 send_config_set() 之前需要明確的操作者旗標。
  • 在變更經過驗證和批准之前,不要呼叫 save_config()。

唯讀連線模式

import os
from getpass import getpass
from netmiko import ConnectHandler
from netmiko.exceptions import (
    NetmikoAuthenticationException,
    NetmikoTimeoutException,
    ReadTimeout,
)

device = {
    "device_type": "cisco_ios",
    "host": "192.0.2.10",
    "username": os.environ.get("NETMIKO_USERNAME") or input("使用者名稱: "),
    "password": os.environ.get("NETMIKO_PASSWORD") or getpass("密碼: "),
    "secret": os.environ.get("NETMIKO_ENABLE_SECRET"),
    "conn_timeout": 10,
    "auth_timeout": 20,
    "banner_timeout": 15,
    "read_timeout_override": 30,
}

try:
    with ConnectHandler(**device) as conn:
        if device.get("secret") and not conn.check_enable_mode():
            conn.enable()
        output = conn.send_command("show ip interface brief", read_timeout=30)
        print(output)
except NetmikoAuthenticationException:
    print("驗證失敗")
except NetmikoTimeoutException:
    print("SSH 連線超時")
except ReadTimeout:
    print("指令讀取超時")

在範例中使用文件範圍內的佔位位址。將真實庫存放於被忽略的本地檔案或機密管理系統中。

批次收集

from concurrent.futures import ThreadPoolExecutor, as_completed
from typing import Any

def collect_show(device: dict[str, Any], command: str) -> dict[str, Any]:
    host = device["host"]
    try:
        with ConnectHandler(**device) as conn:
            output = conn.send_command(command, read_timeout=45)
        return {"host": host, "ok": True, "output": output}
    except (NetmikoAuthenticationException, NetmikoTimeoutException, ReadTimeout) as exc:
        return {"host": host, "ok": False, "error": type(exc).__name__}

results = []
with ThreadPoolExecutor(max_workers=8) as pool:
    futures = [pool.submit(collect_show, device, "show version") for device in devices]
    for future in as_completed(futures):
        results.append(future.result())

保持 max_workers 較低,除非已知裝置群和 AAA 系統能處理更高的連線數量。

結構化解析

Netmiko 可以要求 TextFSM、TTP 或 Genie 解析支援的指令輸出。將解析器輸出視為最佳化手段,而非唯一的證據路徑。

with ConnectHandler(**device) as conn:
    parsed = conn.send_command(
        "show ip interface brief",
        use_textfsm=True,
        raise_parsing_error=False,
        read_timeout=30,
    )

if isinstance(parsed, str):
    print("未匹配到解析器範本;存儲原始輸出以供審查")
else:
    for row in parsed:
        print(row)

如果解析結果驅動了關鍵決策,請將原始指令輸出與解析結果一同保留,以便操作者檢查不一致之處。

受保護的配置模式

import os

commands = [
    "interface GigabitEthernet0/1",
    "description CHANGE-1234 UPLINK-TO-CORE",
]

apply_changes = os.environ.get("APPLY_NETWORK_CHANGES") == "1"

if not apply_changes:
    print("僅乾執行。候選指令:")
    print("\n".join(commands))
else:
    with ConnectHandler(**device) as conn:
        conn.enable()
        before = conn.send_command("show running-config interface GigabitEthernet0/1")
        output = conn.send_config_set(commands)
        after = conn.send_command("show running-config interface GigabitEthernet0/1")
        print(before)
        print(output)
        print(after)
        print("在儲存啟動配置前,請先驗證行為。")

儲存配置是一個獨立的批准步驟。在正式環境中,請包含回滾片段,並在變更記錄中保留前後對比的證據。

審查檢查清單

  • 腳本是否指明了明確的庫存來源?
  • 憑證是否未出現在原始碼、日誌和例外訊息中?
  • 是否設定了 conn_timeout、auth_timeout 和指令 read_timeout?
  • 是否針對每台裝置報告失敗,而不會停止整個批次?
  • 腳本是否避免了廣泛掃描和無限制的並發?
  • 配置變更是否位於乾執行模式或明確的操作者旗標之後?
  • save_config() 是否與初始推送分離,並與驗證相關聯?

反模式

  • 在原始碼中硬編碼密碼、啟用密碼或私鑰。
  • 將發送配置指令作為預設程式碼路徑。
  • 針對 CIDR 範圍而不是經過審查的庫存執行自動化。
  • 將完整的執行配置日誌記錄到未經消毒的共享系統中。
  • 將解析成功視為裝置狀態正確的證明。

另請參閱

  • 技能: cisco-ios-patterns
  • 技能: network-config-validation
  • 技能: network-interface-health

Individual skills in this repo

This repo contains 20 individual skills — each has its own dedicated page.

accessibility

Design, implement, and audit inclusive digital products using WCAG 2.2 Level AA. Use when building or auditing UI that must meet WCAG 2.2 Level AA, or when reviewing a change for keyboard, contrast, or screen-reader support.

affaan-m/content-engine

Create platform-native content systems for X, LinkedIn, TikTok, YouTube, newsletters, and repurposed multi-platform campaigns. Use when the user wants social posts, threads, scripts, content calendars, or one source asset adapted cleanly across platforms.

affaan-m/ECC

Multi-platform content distribution across X, LinkedIn, Threads, and Bluesky. Adapts content per platform using content-engine patterns. Never posts identical content cross-platform. Use when the user wants to distribute content across social platforms.

affaan-m/fal-ai-media

Unified media generation via fal.ai MCP — image, video, and audio. Covers text-to-image (Nano Banana), text/image-to-video (Seedance, Kling, Veo 3), text-to-speech (CSM-1B), and video-to-audio (ThinkSound). Use when the user wants to generate images, videos, or audio with AI.

affaan-m/manim-video

日本語翻訳:このファイルは manim-video 用の日本語翻訳が必要です

affaan-m/remotion-video-creation

Remotion のベストプラクティス - React で動画を作成する。3D、アニメーション、音声、字幕、チャート、トランジションなどをカバーするドメイン固有の29のルール。

affaan-m/video-editing

AI-assisted video editing workflows for cutting, structuring, and augmenting real footage. Covers the full pipeline from raw capture through FFmpeg, Remotion, ElevenLabs, fal.ai, and final polish in Descript or CapCut. Use when the user wants to edit video, cut footage, create vlogs, or build video content.

agent-architecture-audit

Full-stack diagnostic for agent and LLM applications. Audits the 12-layer agent stack for wrapper regression, memory pollution, tool discipline failures, hidden repair loops, and rendering corruption. Produces severity-ranked findings with code-first fixes. Essential for developers building agent applications, autonomous loops, or any LLM-powered feature. Use when an agent or LLM feature misbehaves and the failing layer is unknown, or before shipping an agent stack.

agent-eval

Head-to-head comparison of coding agents (Claude Code, Aider, Codex, etc.) on custom tasks with pass rate, cost, time, and consistency metrics. Use when choosing between coding agents, or when a change to an agent setup needs measured pass rate, cost, and time rather than an impression.

agent-harness-construction

Design and optimize AI agent action spaces, tool definitions, and observation formatting for higher completion rates. Use when defining or revising an agent

agentic-engineering

Operate as an agentic engineer using eval-first execution, decomposition, and cost-aware model routing. Use when planning or executing engineering work that agents will carry out end to end.

agentic-os

Build persistent multi-agent operating systems on Claude Code. Covers kernel architecture, specialist agents, slash commands, file-based memory, scheduled automation, and state management without external databases. Use when building a persistent multi-agent system on Claude Code with its own memory, commands, and scheduling.

agent-introspection-debugging

Structured self-debugging workflow for AI agent failures using capture, diagnosis, contained recovery, and introspection reports. Use when an agent run fails and you need a reproducible diagnosis instead of a retry.

agent-payment-x402

Add x402 payment execution to AI agents with per-task budgets, spending controls, and non-custodial wallets. Supports Base through agentwallet-sdk and X Layer through OKX Payments / OKX Agent Payments Protocol. Use when an agent must pay for something itself and needs per-task budgets, spending controls, and a non-custodial wallet.

agent-self-evaluation

Use after completing any non-trivial task. The agent self-rates its output on 5 axes — accuracy, completeness, clarity, actionability, conciseness — with concrete evidence per criterion. Produces a structured 1-5 scorecard with specific improvement suggestions.

agent-sort

Build an evidence-backed ECC install plan for a specific repo by sorting skills, commands, rules, hooks, and extras into DAILY vs LIBRARY buckets using parallel repo-aware review passes. Use when ECC should be trimmed to what a project actually needs instead of loading the full bundle.

ai-first-engineering

Engineering operating model for teams where AI agents generate a large share of implementation output. Use when setting team process, review gates, or ownership rules for a codebase largely written by agents.

ai-regression-testing

Regression testing strategies for AI-assisted development. Sandbox-mode API testing without database dependencies, automated bug-check workflows, and patterns to catch AI blind spots where the same model writes and reviews code. Use when adding regression coverage to AI-assisted code, or when the same model both wrote and reviewed a change.

android-clean-architecture

Clean Architecture patterns for Android and Kotlin Multiplatform projects — module structure, dependency rules, UseCases, Repositories, and data layer patterns. Use when structuring modules, layers, or data flow in an Android or KMP project.

angular-developer

Generates Angular code and provides architectural guidance. Trigger when creating projects, components, or services, or for best practices on reactivity (signals, linkedSignal, resource), forms, dependency injection, routing, SSR, accessibility (ARIA), animations, styling (component styles, Tailwind CSS), testing, or CLI tooling.

相關技能