colinardo
Goto Top

Powershell: Fritz!Box Telnet-Befehle ausführen lassen

Für alle die es brauchen können und keine externen Tools außer nativer Powershell verwenden möchten, hier eine Funktion die das automatische Einloggen und Absetzen von einzelnen oder mehreren Telnet-Kommandos auf einer Fritzbox beherrscht.
back-to-topPowershell-Funktion: Send-FritzBoxCommands
function Send-FritzBoxCommands{
    param(
        [string]$hostname = "fritz.box",  
        [parameter(mandatory=$true)][string]$password,
        [parameter(mandatory=$true)][string[]]$commands,
        [int]$waittime = 1000  # waittime between commands
    )
    try{
        $tcpclient = new-object System.Net.Sockets.TcpClient($hostname,23) -ErrorAction Stop
        if ($tcpClient){
            write-host "Connected to $hostname" -ForegroundColor Green  
            $stream = $tcpclient.GetStream()
            $writer = new-Object System.IO.StreamWriter($stream)
            $buffer = new-Object Byte 1024
            $encoding = new-Object System.Text.ASCIIEncoding
        
            # Login -----------
            write-host "Login ..." -ForegroundColor Green  
            # wait for login prompt
            $strtemp =""  
            while($strtemp -notmatch 'password:'){  
                [int32]$bytes = $stream.Read($buffer,0,$buffer.length);$strtemp += $encoding.GetString($buffer,0,$bytes)
            }
            $writer.WriteLine($password);$writer.Flush()

            # wait for shell prompt        
            $strtemp =""  
            while($strtemp -notmatch '(?m)^#|login failed'){  
                [int32]$bytes = $stream.Read($buffer,0,$buffer.length);$strtemp += $encoding.GetString($buffer,0,$bytes)
            }
            if ($strtemp -match 'login failed'){write-host "Login failed (wrong password?)" -ForegroundColor Red; return $false}  
            # -------------

            # invoke remote commands
            $commands | %{
                write-host "Invoking Command: $_" -ForegroundColor Yellow  
                $writer.WriteLine($_)
                $writer.Flush()
                sleep -Milliseconds $waittime
            }
            $output = ""  
            while ($stream.DataAvailable){
                [int32]$bytes = $stream.Read($buffer,0,$buffer.length)
                $output += $encoding.GetString($buffer,0,$bytes)
            }
            # release resources
            $writer.Close();$writer.Dispose();$tcpclient.Close(); $tcpclient.Dispose()
            # return output
            write-host "Response:`n" -ForegroundColor Black -BackgroundColor Yellow  
            return $output
        }
    }catch{
        write-host $_.Exception.Message -ForegroundColor Red
        return $false
    }
}
back-to-topBeispiele zur Anwendung
back-to-topÜbermitteln eines einzelnen Befehls
Send-FritzBoxCommands -password 'GeheimesPasswort' -commands 'ls -la'
back-to-topÜbermitteln mehrerer Befehle auf einmal
Send-FritzBoxCommands -password 'GeheimesPasswort' -commands 'help','ls -la','free'
back-to-topÜbergabe der IP oder des Hostnamens der Fritzbox
Send-FritzBoxCommands -hostname "192.168.178.1" -password 'GeheimesPasswort' -commands 'ls -la','free'

back-to-topAusgabe
Ausgegeben wird der gesamte Output der Befehle.

back-to-topHinweise
Eventuell ist es nötig den Parameter -waittime je nach Befehlsdauer zu erhöhen. Standardmäßig beträgt dieser 1 Sekunde (1000ms) - das Script wartet also nach jedem Befehl 1 Sekunde bevor der nächste ausgeführt wird.
back-to-topEine Übersicht der möglichen Telnet-Befehle für die Fritzbox findet man auf folgenden Seiten:

Viel Spaß damit.
Grüße @colinardo

Falls der Beitrag gefällt, seid so nett und unterstützt mich durch eine kleine Spende / If you like my contribution please support me and donate
back-to-topUpdates
DatumÄnderung
05.05.2015Login optimiert und Fehler bei falschem Passwort abgefangen

Content-Key: 271025

Url: https://administrator.de/contentid/271025

Ausgedruckt am: 19.03.2024 um 04:03 Uhr