Handbuch · Version 1.0 · kostenlos von codekunst systems GmbH
SwitchConfigFetcher meldet sich per SSH oder Telnet an Ihren Netzwerk-Switchen an, ruft die Konfiguration und einige Diagnose-Ausgaben ab und legt alles als Textdateien ab. So haben Sie jederzeit einen aktuellen Stand Ihrer Geräte, auch wenn einmal ein Switch ausfällt oder jemand etwas verstellt.
SwitchConfigFetcher.exe genügt.SHA256SUMS.txt; mit Get-FileHash .\SwitchConfigFetcher.exe können Sie sie vergleichen.Öffnen Sie eine PowerShell im Ordner mit der SwitchConfigFetcher.exe. Wir empfehlen, die Datei nach C:\Tools\SwitchConfigFetcher\ oder C:\Program Files\codekunst systems GmbH\SwitchConfigFetcher\ zu legen.
.\SwitchConfigFetcher.exe init
Das legt C:\ProgramData\codekunst systems GmbH\SwitchConfigFetcher\ an (Konfiguration, Ausgabe, Logs) und schreibt eine Start-config.json. Einen anderen Ort wählen Sie mit init --root D:\SCF.samples (siehe Abschnitt 3), tragen Sie Ihre Switche ein und speichern Sie sie als config.json in den Ordner aus Schritt 1..\SwitchConfigFetcher.exe set-password --all
.\SwitchConfigFetcher.exe set-password --ip 10.0.1.1 --enable
Das erste Kommando setzt das Login-Passwort für alle Switche, das zweite das Enable-Passwort eines einzelnen Geräts..\SwitchConfigFetcher.exe validate-config
.\SwitchConfigFetcher.exe list
Meldet OK, wenn alles passt, sonst eine verständliche Fehlermeldung..\SwitchConfigFetcher.exe --dry-run
Zeigt nur, welche Geräte abgefragt würden. Es wird keine Verbindung aufgebaut..\SwitchConfigFetcher.exe --ip 10.0.1.1 --verbose
Die Ergebnisse liegen danach unter ...\SwitchConfigFetcher\output\10.0.1.1\<Datum_Uhrzeit>\. Läuft das, rufen Sie ohne --ip alle Geräte ab.Die Datei config.json ist eine normale JSON-Datei. Zeilenkommentare (// ...) und ein Komma am Zeilenende sind erlaubt. Im Ordner samples liegen vier Vorlagen:
| Datei | Inhalt |
|---|---|
config.example.json | Minimalbeispiel mit einem Cisco-Switch |
config.cisco.example.json | Cisco: Standard-IOS, Catalyst 1000, Telnet-Altgerät, deaktivierter Switch |
config.multivendor.example.json | je ein Gerät für HP, Aruba, Extreme, MikroTik, UniFi und Cisco |
config.vendor-override.example.json | zusätzliche Befehle für ein Profil (siehe Abschnitt 8) |
Die Beispiele sind absichtlich nicht lauffähig: Solange bei passwordEncrypted noch REPLACE_WITH_OUTPUT_OF_encrypt_COMMAND steht, bricht das Programm ab. So läuft nichts versehentlich mit falschen Zugangsdaten gegen Ihre Geräte.
{
"ip": "10.0.1.1", // Pflicht, zugleich Name des Ausgabeordners
"hostname": "core-sw-01", // optional, nur für Anzeige und Logs
"group": "core", // optional, für --group
"vendor": "cisco-ios", // Pflicht, Name eines Profils (Abschnitt 8)
"protocol": "ssh", // "ssh" oder "telnet"
"port": 22, // optional (Standard: SSH 22, Telnet 23)
"username": "admin", // Pflicht
"passwordEncrypted": "AQAAANCM...", // wird von set-password eingetragen
"enablePasswordEncrypted": "AQAAANCM...", // nur bei Geräten mit Enable-Stufe
"enabled": true // false = Switch überspringen
}
| Bereich | Feld | Bedeutung (Standard) |
|---|---|---|
output | basePath | Wurzel für die Ergebnisse (...\SwitchConfigFetcher\output) |
timestampFormat | Format des Zeitstempel-Ordners (yyyy-MM-dd_HHmm) | |
execution | maxParallel | Wie viele Geräte gleichzeitig abgefragt werden (5 im Beispiel) |
connectTimeoutSeconds | Wartezeit für den Verbindungsaufbau in Sekunden (15) | |
commandTimeoutSeconds | Wartezeit auf die Antwort je Befehl in Sekunden (60) | |
logging | level | Ausführlichkeit auf der Konsole: Trace, Debug, Information, Warning, Error, Critical (Information) |
filePath | Log-Datei; {yyyy-MM-dd} wird durch das Datum ersetzt |
Der empfohlene Weg ist set-password. Es fragt das Passwort verdeckt ab (zur Kontrolle zweimal), verschlüsselt es mit Windows-DPAPI und trägt nur den verschlüsselten Wert in die config.json ein. Das Klartext-Passwort steht weder in einer Datei noch in der PowerShell-Verlaufsliste noch in der Prozessliste.
| Kommando | Wirkung |
|---|---|
set-password --all | Login-Passwort für alle Switche (gleiches Passwort) |
set-password --ip 10.0.1.1,10.0.1.2 | nur für diese Geräte |
set-password --group core | für alle Geräte einer Gruppe |
set-password --group core --enable | setzt das Enable-Passwort statt des Login-Passworts |
encrypt | gibt nur den verschlüsselten Wert aus (verdeckte Eingabe), den Sie selbst einfügen |
Vor jeder Änderung legt set-password eine Sicherung als config.json.bak an. Weil die Datei dabei neu geschrieben wird, gehen Kommentare in der config.json verloren. Die Sicherung enthält sie noch.
icacls "C:\ProgramData\codekunst systems GmbH\SwitchConfigFetcher" /inheritance:r
icacls "C:\ProgramData\codekunst systems GmbH\SwitchConfigFetcher" /grant:r "Administrators:(OI)(CI)F" "SYSTEM:(OI)(CI)F"password) wird zwar beim ersten Lauf automatisch verschlüsselt, dabei bleibt aber eine config.json.bak mit dem Klartext zurück. Nicht empfohlen. Löschen Sie die .bak-Datei, wenn Sie es doch getan haben.| Aufruf | Wirkung |
|---|---|
SwitchConfigFetcher.exe | alle aktivierten Switche abrufen |
--ip 10.0.1.1 oder --ip 10.0.1.1,10.0.2.5 | nur diese Geräte |
--group core | nur eine Gruppe |
--parallel 10 | Parallelität für diesen Lauf ändern |
--dry-run | Plan anzeigen, ohne Verbindung |
--verbose | Detail-Ausgabe auf der Konsole |
--config D:\andere.json | andere Konfigurationsdatei verwenden |
init [--root <Ordner>] [--no-sample] | Ordner und Start-Konfiguration anlegen (überschreibt nichts) |
set-password ... | Passwort verschlüsselt eintragen (siehe Abschnitt 4) |
encrypt | Passwort verschlüsseln und den Wert ausgeben |
list | alle konfigurierten Switche als Tabelle |
validate-config | Konfiguration prüfen (Aufbau, doppelte IPs, unbekannte Profile, offene Platzhalter) |
--help, --version | Hilfe, Versionsnummer |
Pro Lauf und Gerät entsteht ein Ordner mit Zeitstempel:
output\
└── 10.0.1.1\
├── 2026-10-01_0230\
│ ├── running-config.txt
│ ├── version.txt
│ ├── interfaces.txt
│ ├── mac-table.txt
│ └── vlans.txt
└── 2026-10-02_0230\ ...
.txt eine .err-Datei. Schlägt das ganze Gerät fehl, steht fetch.err im Ordner.logs\fetcher-JJJJ-MM-TT.log) enthält immer die Details. Passwörter stehen nie darin. Zeitüberschreitungen listen die letzten empfangenen Zeichen auf, daran erkennen Sie, was das Gerät tatsächlich geantwortet hat. Alte Logs und Ergebnisse werden nicht automatisch gelöscht.| Rückgabewert | Bedeutung |
|---|---|
0 | alles in Ordnung (auch Probelauf und init) |
1 | Fehler in Konfiguration oder Aufruf |
2 | mindestens ein Gerät ist fehlgeschlagen, die anderen waren erfolgreich |
Das Programm hat keinen eigenen Zeitplan. Nutzen Sie dafür die Windows-Aufgabenplanung, zum Beispiel jede Nacht um 02:30 Uhr:
$exe = "C:\Tools\SwitchConfigFetcher\SwitchConfigFetcher.exe"
$action = New-ScheduledTaskAction -Execute $exe
$trigger = New-ScheduledTaskTrigger -Daily -At 02:30
$principal = New-ScheduledTaskPrincipal -UserId "SYSTEM" -LogonType ServiceAccount -RunLevel Highest
$settings = New-ScheduledTaskSettingsSet -StartWhenAvailable -DontStopOnIdleEnd
Register-ScheduledTask -TaskName "SwitchConfigFetcher" -Action $action -Trigger $trigger -Principal $principal -Settings $settings
Get-ChildItem "C:\ProgramData\codekunst systems GmbH\SwitchConfigFetcher\logs\*.log" |
Where-Object { $_.LastWriteTime -lt (Get-Date).AddDays(-90) } | Remove-ItemEin Profil beschreibt, wie das Programm mit einem Gerätetyp spricht: Prompts, Anmeldung, abzufragende Befehle, Abmeldung. Im Feld vendor eines Switch-Eintrags steht der Name des Profils.
| Profil | SSH | Telnet | Hinweis |
|---|---|---|---|
cisco-ios | ja | ja | Standard-Cisco (Catalyst, ISR, IOS-XE), mit Enable-Stufe |
cisco-ios-legacy | nein | ja | alte Cisco-Geräte nur mit Passwort, ohne Benutzername |
cisco-ios-c1000 | ja | ja | Cisco Catalyst 1000 |
cisco-ios-c1000-oem | ja | ja | Cisco-kompatible Geräte mit abweichender Oberfläche |
hp-procurve | ja | ja | HP ProCurve; bei Telnet mit Schritt „beliebige Taste“ |
aruba-aoscx | ja | ja | Aruba AOS-CX |
extreme-exos | ja | ja | Extreme Networks EXOS |
mikrotik | ja | nein | RouterOS; Anmeldung erledigt SSH selbst |
unifi | ja | nein | Ubiquiti UniFi mit SSH-Shell |
--ip <Adresse> --verbose.Die eingebauten Profile sehen Sie nach init im Ordner profiles neben der config.json (nur zur Ansicht, das Programm verwendet die eingebauten). Änderungen gehören in vendorOverrides der config.json:
"vendorOverrides": {
"cisco-ios": {
"ssh": {
"commands": [
{ "name": "running-config", "send": "show running-config", "expect": "privExec" },
{ "name": "version", "send": "show version", "expect": "privExec" },
{ "name": "cdp-neighbors", "send": "show cdp neighbors detail", "expect": "privExec" }
]
}
}
}
name ist der Dateiname der Ausgabe, send der Befehl am Gerät, expect der Prompt (aus dem Profil), auf den gewartet wird.Starten Sie immer zuerst mit .\SwitchConfigFetcher.exe --ip <Adresse> --verbose und öffnen Sie daneben die Log-Datei.
| Meldung | Ursache und Lösung |
|---|---|
passwordEncrypted is still a placeholder | Es steht noch REPLACE_WITH_... in der Konfiguration. set-password ausführen (bei Enable-Passwort mit --enable) oder den Eintrag mit "enabled": false deaktivieren. |
could not be decrypted on this host | Die Passwörter wurden auf einem anderen Rechner verschlüsselt. set-password auf diesem Rechner erneut ausführen. |
Unknown vendor profile '...' | Der Wert bei vendor ist kein Profilname. Schreibweise mit der Tabelle in Abschnitt 8 vergleichen. |
Profile '...' has no 'telnet' section | Dieses Profil gibt es nur per SSH (MikroTik, UniFi). "protocol": "ssh" verwenden. |
SSH: Permission denied | Anmeldung abgelehnt. Mit PuTTY oder ssh mit genau denselben Zugangsdaten testen; Groß- und Kleinschreibung des Passworts beachten. |
read timed out waiting for ... | Das Programm wartet auf einen Prompt, bekommt aber etwas anderes. In der Log-Datei stehen die letzten 200 empfangenen Zeichen. Häufig: falsches Passwort (% Bad passwords), Gerät ohne Enable-Stufe (anderes Profil wählen) oder ein Banner mit Zusatzabfrage. |
| Ein Gerät hängt | Nach commandTimeoutSeconds gilt es als fehlgeschlagen, die anderen laufen weiter. Rückgabewert dann 2. |
LICENSE.txt.SECURITY.txt bzw. www.codekunst-systems.com/security.