Skip to content

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)

# Reine Abfrage ohne Änderung
$Command = "cat /etc/openwrt_release"

SSH-Passwort ändern

# Passwort für root-User setzen
$Command = "echo 'root:NeuesPasswort123' | chpasswd"

Dienst neu starten

# Einen beliebigen Dienst neu starten
$Command = "/etc/init.d/firewall restart"

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:

Install-Module Posh-SSH -Scope CurrentUser

CSV-Datei anlegen

Im gleichen Verzeichnis wie das Script muss eine Datei devices.csv liegen mit folgendem Aufbau:

ip,username,password
192.168.1.1,admin,geheim123
192.168.1.2,root,passwort456
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:

$HostnameOfOnPremise = "rms.domain.tld"   # FQDN des eigenen RMS-Servers

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:

  1. SSH-Verbindung mit den Zugangsdaten aus der CSV aufbauen
  2. 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
  1. Ergebnis (Exit-Code, Ausgabe, Fehler) in der Konsole ausgeben
  2. 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.