Massenkonfiguration von Teltonika-Routern via PowerShell/SSH¶
Kategorie: Netzwerk / Router-Management
Betrifft: Teltonika Router (OpenWRT/UCI-basiert)
Voraussetzung: PowerShell 5.1+ mit Posh-SSH Modul
Repository: github.com/rony326/powershellscripts – ops-scripts
Übersicht¶
Dieses Script ermöglicht die automatisierte Konfiguration und Administration mehrerer Teltonika-Router per SSH. Es verbindet sich der Reihe nach mit jedem Gerät aus einer CSV-Liste und führt einen frei definierbaren Shell-Befehl aus.
Das Script wurde ursprünglich für die Migration des RMS-MQTT-Endpunkts auf einen eigenen On-Premise-Server entwickelt, ist aber als generisches Werkzeug für beliebige SSH-Massenbefehle konzipiert. Der auszuführende Befehl ist eine einfache Variable – damit lässt sich das Script ohne strukturelle Änderungen für unterschiedlichste Aufgaben wiederverwenden.
Anwendungsfälle¶
Das Script ist nicht auf RMS beschränkt – jeder beliebige Shell-Befehl kann in $Command hinterlegt werden. Typische Einsatzszenarien:
RMS / Cloud-Migration
# RMS-Endpunkt auf eigenen Server umstellen
$Command = "uci set rms_mqtt.rms_connect_mqtt.remote='rms.domain.tld' && uci set rms_mqtt.rms_connect_mqtt.enable='1' && uci commit && /etc/init.d/rms_mqtt restart"
NTP-Server ändern
# Internen NTP-Server setzen
$Command = "uci set system.ntp.server='ntp.intern.domain.tld' && uci commit system && /etc/init.d/sysntpd restart"
DNS-Server ändern
# Primären DNS-Server setzen
$Command = "uci set network.wan.dns='192.168.0.1' && uci commit network && /etc/init.d/network restart"
Firmware-Version auslesen (Inventur)
SSH-Passwort ändern
Dienst neu starten
Mehrere UCI-Einstellungen in einem Durchlauf
# Mehrere Werte setzen und gemeinsam committen
$Command = "uci set system.@system[0].hostname='router-prod-01' && uci set system.@system[0].timezone='CET-1CEST,M3.5.0,M10.5.0/3' && uci commit system"
Tipp: Mit
&&verkettete Befehle werden nur ausgeführt, wenn der vorherige erfolgreich war (Exit-Code 0). Für unabhängige Befehle stattdessen;als Trennzeichen verwenden.
Voraussetzungen¶
PowerShell-Modul installieren¶
Das Modul Posh-SSH muss einmalig installiert werden:
CSV-Datei anlegen¶
Im gleichen Verzeichnis wie das Script muss eine Datei devices.csv liegen mit folgendem Aufbau:
| Spalte | Beschreibung |
|---|---|
ip |
IP-Adresse des Routers |
username |
SSH-Benutzername (meist root) |
password |
SSH-Passwort des Geräts |
Script-Konfiguration¶
Am Anfang des Scripts gibt es zwei Variablen, die vor dem Ausführen angepasst werden müssen:
Optional können auch die Timeouts angepasst werden:
$ConnectionTimeoutSec = 120 # Verbindungs-Timeout in Sekunden
$CommandTimeoutSec = 300 # Befehlsausführungs-Timeout in Sekunden
Funktionsweise¶
Das Script iteriert über alle Einträge in der CSV und führt pro Gerät folgende Schritte aus:
- SSH-Verbindung mit den Zugangsdaten aus der CSV aufbauen
- Folgenden UCI-Befehl auf dem Router ausführen:
uci set rms_mqtt.rms_connect_mqtt.remote='rms.domain.tld'
uci set rms_mqtt.rms_connect_mqtt.enable='1'
uci commit
/etc/init.d/rms_mqtt restart
- Ergebnis (Exit-Code, Ausgabe, Fehler) in der Konsole ausgeben
- SSH-Verbindung sauber trennen
Die Konfigurationsänderungen werden mit uci commit dauerhaft gespeichert und der RMS-MQTT-Dienst anschliessend neu gestartet.
Ausgabe im Terminal¶
| Farbe | Bedeutung |
|---|---|
| Cyan | Verbindungsversuch läuft |
| Grün | Verbindung erfolgreich / Gerät konfiguriert |
| Rot | Fehler bei Verbindung oder Befehlsausführung |
| Dunkelgrau | Verbindung getrennt |
Fehlerbehandlung¶
- Schlägt die SSH-Verbindung fehl, wird der Fehler ausgegeben und mit dem nächsten Gerät fortgefahren.
- Gibt der Befehl einen Exit-Code ≠ 0 zurück, wird dies als Fehler markiert und die Fehlerausgabe des Routers angezeigt.
- Die SSH-Session wird in jedem Fall (auch bei Fehler) im
finally-Block geschlossen.
Vollständiges Script¶
# Einmalig nötig:
# Install-Module Posh-SSH -Scope CurrentUser
Import-Module Posh-SSH
$CsvPath = Join-Path -Path $PSScriptRoot -ChildPath "devices.csv"
$HostnameOfOnPremise = "rms.domain.tld"
$ConnectionTimeoutSec = 120
$CommandTimeoutSec = 300
$Command = "uci set rms_mqtt.rms_connect_mqtt.remote='$HostnameOfOnPremise' && " +
"uci set rms_mqtt.rms_connect_mqtt.enable='1' && " +
"uci commit && " +
"/etc/init.d/rms_mqtt restart"
$Devices = Import-Csv -Path $CsvPath
foreach ($Device in $Devices) {
$Ip = $Device.ip
$Username = $Device.username
$Password = $Device.password
Write-Host "Verbinde zu $Ip ..." -ForegroundColor Cyan
$SecurePassword = ConvertTo-SecureString $Password -AsPlainText -Force
$Credential = New-Object System.Management.Automation.PSCredential ($Username, $SecurePassword)
$Session = $null
try {
$Session = New-SSHSession `
-ComputerName $Ip `
-Credential $Credential `
-AcceptKey `
-ConnectionTimeout $ConnectionTimeoutSec `
-KeepAliveInterval 30 `
-ErrorAction Stop
Write-Host "Verbunden mit $Ip. Führe Befehl aus ..." -ForegroundColor Green
$Result = Invoke-SSHCommand `
-SessionId $Session.SessionId `
-Command $Command `
-TimeOut $CommandTimeoutSec `
-ErrorAction Stop
if ($Result.ExitStatus -eq 0) {
Write-Host "OK: $Ip erfolgreich konfiguriert." -ForegroundColor Green
} else {
Write-Host "FEHLER: $Ip ExitStatus $($Result.ExitStatus)" -ForegroundColor Red
Write-Host ($Result.Error -join "`n")
}
if ($Result.Output) {
Write-Host "Output von $($Ip):"
Write-Host ($Result.Output -join "`n")
}
}
catch {
Write-Host "FEHLER bei $Ip : $($_.Exception.Message)" -ForegroundColor Red
}
finally {
if ($Session) {
Remove-SSHSession -SessionId $Session.SessionId | Out-Null
Write-Host "Verbindung zu $Ip getrennt." -ForegroundColor DarkGray
}
}
Write-Host ""
}
Hinweise¶
- Der SSH-Host-Key wird automatisch akzeptiert (
-AcceptKey). In sicherheitskritischen Umgebungen sollte der Key zuvor manuell verifiziert werden. - Das Script ist sequenziell – bei vielen Geräten kann die Laufzeit entsprechend lang sein. Für parallele Ausführung kann
ForEach-Object -Parallel(PowerShell 7+) genutzt werden. - Passwörter liegen im Klartext in der CSV-Datei. Zugriffsrechte auf diese Datei entsprechend einschränken.