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",
]
…
Handle returns, refunds, fraud checks, and warranty claim decisions efficiently.
Use Bun for runtime, bundling, testing, packages, and Node migration decisions.
Use the correct Ethereum Keccak-256 hashing in Node.js and TypeScript.
Apply Nuxt 4 patterns for SSR safety, performance, and data fetching.
Generate images, videos, and audio with one unified AI media workflow.
Design Quarkus 3 backend patterns for messaging, APIs, data, and async workflows.
Connect to network devices over SSH to run commands and push configs.
Lets AI safely run read-only Cisco show commands over SSH.
Orchestrate multi-vendor network operations with natural language queries and CLI automation.
Manage MikroTik router configuration and network operations over SSH.
Turn MikroTik routers into AI-driven tools for automated network configuration.
Securely diagnose remote servers over SSH with guarded read and write access.