Safely automate SSH collection, parsing, and controlled network changes with Netmiko.
Copy the install command and let the AI configure it · recommended for beginners
Please install the "netmiko-ssh-automation" skill from askskill: 1. Download https://raw.githubusercontent.com/affaan-m/ECC/main/skills/netmiko-ssh-automation/SKILL.md 2. Save it as ~/.claude/skills/netmiko-ssh-automation/SKILL.md 3. Reload skills and tell me it's ready
Write a read-only Python script with Netmiko to connect to 50 Cisco devices in batches, run show version and show ip interface brief, limit concurrency to 5, set connection and command timeouts, continue on per-device failures, and save results to CSV.
A Netmiko script with concurrency limits, timeouts, and error handling that collects and exports device data.
Show how to use Netmiko with TextFSM to parse show ip interface brief output, extract interface name, IP, status, and protocol state, and return a JSON list; if parsing fails, fall back to raw text and log a warning.
Example code that uses TextFSM parsing with fallback handling and outputs structured interface data.
Generate a Netmiko configuration change script that backs up the current config first, verifies the target interface exists, and only applies a description change on matching devices; print a summary before and after each device, and stop that device on errors with rollback guidance.
A guarded configuration script template with prechecks, backup, change execution, and error protection.
Use this skill when writing or reviewing Python automation that connects to network devices with Netmiko. Keep the default path read-only; config changes need a separate change window, peer review, and rollback plan.
show command output across routers, switches, or firewalls.send_command() collection.getpass; never hardcode credentials.send_config_set().save_config() until the change has been verified and approved.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("Username: "),
"password": os.environ.get("NETMIKO_PASSWORD") or getpass("Password: "),
"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("Authentication failed")
except NetmikoTimeoutException:
print("SSH connection timed out")
except ReadTimeout:
print("Command read timed out")
Use placeholder addresses from documentation ranges in examples. Keep real inventory in an ignored local file or a secrets-managed system.
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())
Keep max_workers low unless the device estate and AAA systems are known to
handle higher connection volume.
Netmiko can ask TextFSM, TTP, or Genie to parse supported command output. Treat parser output as an optimization, not the only evidence path.
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("No parser template matched; store raw output for review")
else:
for row in parsed:
print(row)
If parsing drives a blocking decision, keep the raw command output alongside the parsed result so an operator can inspect mismatches.
import os
commands = [
"interface GigabitEthernet0/1",
"description CHANGE-1234 UPLINK-TO-CORE",
]
…
Plan a reliable home or homelab network with practical setup guidance.
Build robust Python test suites with pytest, TDD, mocking, and coverage.
Orchestrate RFC-based multi-agent workflows with quality gates and merge queues.
Manage, edit, summarize, and organize Google Workspace files in one workflow.
Orchestrate bug fixing from repro to gated commit with delegated agents.
Learn frontend patterns for React, Next.js, state, performance, and UI best practices.
Connect to network devices over SSH to run commands and push configs.
Run read-only diagnostic SSH commands on remote systems without risking changes.
Manage multi-vendor network devices over SSH using natural language automation.
Let AI manage network devices via SSH/Telnet for ops.
Enable n8n AI agents to manage MikroTik routers over SSH or SSE.
Orchestrate multi-vendor network operations with natural language queries and CLI automation.