Fritzbox 7270 Sicherung automatisieren

Enkidoo

Neuer User
Mitglied seit
28 Mrz 2013
Beiträge
60
Punkte für Reaktionen
2
Punkte
8
Hallo,

ich hoffe, ich poste das Thema im richtigen Unterforum. Ich würde gerne meine Fritzbox bei der regelmäßigen Datensicherung mit einbeziehen. Gibt es da eine Möglichkeit, die Sicherungsdatei per Batch zu erzeugen, anstatt manuell über die Weboberfläche?

Besten Gruß und ein gutes neues Jahr!
 
http://avm.de/fileadmin/user_upload/Global/Service/Schnittstellen/deviceconfigSCPD.pdf

Ohne Information, was das für ein System ist, das diese Datensicherung ausführt, bringen weitere Infos wenig.

Ist es ein Linux-System, kann man mit wenig Aufwand per Bash-Skript eine Sicherung machen (oder beliebig kompliziert mit PHP/Python), bei einem Windows-System bietet sich PowerShell (ggf. mit einem kleinen C#-Programm als Wrapper für den TR-064-Service - Stichwort WCF) an.
 
Stimmt, sorry, hier läuft Windows 7 und für die Sicherung nutze ich eine batch-Datei. Danke für den Link. Das Thema TR-064 ist für mich Neuland und ein C# Programm kann ich leider auch nicht schreiben.

Wenn ich das richtig verstehe, muss man per TR-064 der Fritzbox sagen "X_AVM-DE_GetConfigFile" und sie sagt mir dann eine URL, unter der die Sicherungsdatei herunter geladen werden kann. Hmm. Klingt komplizierter als gedacht :confused: Gibt es da vielleicht etwas ein wenig Vorgekauteres? ;)
 
Gibt es da vielleicht etwas ein wenig Vorgekauteres? ;)
Ich denke nicht, daß der alternative Weg über das GUI (Webbrowser emulieren mit Anmeldung und Download der Sicherung) einfacher ist und auf Dauer ist das sicherlich auch keine wirklich stabile Lösung. Wenn Du davon ausgehst, daß Deine 7270 das Ende der Fahnenstange ist (die wird sicherlich keine Version mit einem GUI im "responsive design" mehr kriegen), dann reicht natürlich (bei deaktiviertem Login in die FRITZ!Box - ein weiteres "no go" in meinen Augen) auch ein simpler Download mit der richtigen Adresse ... ein "wget" gibt es auch in einer Version für Windows bzw. so ein simpler HTTP-Download geht auch mit der PowerShell aus dem Stand:
Code:
powershell.exe -Command "& {Invoke-WebRequest -Uri http://<url> -OutFile '<output file>'}"
Auch hier wieder beliebig intelligent ausbaubar ... aber etwas "richtig Vorgekautes" für "Windows-Batch" (also cmd.exe) kenne ich auch nicht. Ist sicherlich das falsche "Biotop" für solche Sachen, m.W. fehlt schon ein Programm zur Bildung eines MD5-Hashes. Wenn man dafür dann irgendwelche Binärdateien suchen und installieren muß (oder gar eine cygwin-Umgebung), kann man auch gleich wieder auf PowerShell zurückgreifen.
 
Danke für Deine Anregungen! Folgendes Powershell-Skript habe ich anhand eines Beispielskripts aus dem c't-Magazin zusammengestöpselt ;)

Code:
# Erstmal einen WebClient erzeugen, der später mit der Box spricht
$w=New-Object System.Net.WebClient

# Das Encoding sollte immer UTF8 sein.
$w.Encoding=[System.Text.Encoding]::UTF8

# Auch im http-Header muss stehen, dass die Kommunikation per UTF-8 kodiert ist
$w.Headers.Set("Content-Type", 'text/xml; charset="utf-8"')

# Der Funktionsaufruf kommt in den Header SOAPACTION Name der Funktion laut http://avm.de/fileadmin/user_upload/Global/Service/Schnittstellen/deviceconfigSCPD.pdf
$w.Headers.Set("SOAPACTION", 'urn:dslforum-org:service:DeviceConfig:1#X_AVM-DE_GetConfigFile')

# Der SOAP-Aufruf wird in XML verpackt, und zwar...
# ... beginnt er mit einem immer gleichen Header.

$query='<?xml version="1.0"?>
        <s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/"
        s:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
        <s:Body> ' +
        # Dann kommt nochmal der Aufruf, diesmal steht der Funktionsname vorne
        # Der mitgegebene Parameter steht innerhalb des Funktions-Tags
        # Hier wird mit NewX_AVM-DE_Password das Passwort der Fritzbox eingetragen
        '<u:X_AVM-DE_GetConfigFile xmlns:u="urn:dslforum-org:service:DeviceConfig:1">
        <NewX_AVM-DE_Password>xxxxxxxx</NewX_AVM-DE_Password>
        </u:X_AVM-DE_GetConfigFile>' +
        # Und das Ende ist auch immer gleich
        '</s:Body>
        </s:Envelope>'

# Der WebClient braucht nur die Zugangsdaten, dann wickelt er das Login ganz allein ab.
# dslf-config ist der im TR-64-Standard definierte Name.
$w.Credentials=New-Object System.Net.NetworkCredential("dslf-config","xxxxxxxx")

# Diese XML-Abfrage schickt der Web-Client mit der Funktion UploadString an die Box.
# Der genaue URL gehört zum Service (siehe Artikel c't 6-2015)
# Die Typ-Umwandlung im XML macht aus der Antwort gleich eine Baumstruktur, ...
$r = [xml]$w.UploadString("http://192.168.x.x:49000/upnp/control/deviceconfig",$query)

# ... in der sich die gesuchte Information über ihren Namen ansprechen lässt.
# In diesem Falle ist das der URL, unter der die Box die Sicherungdatei zum Download anbietet.
$url=$r.Envelope.Body.'X_AVM-DE_GetConfigFileResponse'.'NewX_AVM-DE_ConfigFileUrl'

# Am Besten funktioniert der Download, wenn im WebClient keine Header gesetzt sind.
$w.Headers.Clear()

# Und gleich in die Datei saugen:
#$w.DownloadFile( $url, "Fritzbox_7270_Sicherung.export")

Das scheint auch so weit zu funktionieren. Für Verbesserungsvorschläge bin ich natürlich dankbar.
 
Nur für den Fall, dass jemand an dem Skript Interesse hat, hier noch eine Version, die ich ein wenig ausgebaut habe. Funktionieren sollte es auch mit anderen Fritzbox Modellen als der 7270, aber da habe ich keine Möglichkeit zum Testen.

Hinzugekommen ist:
-Das Passwort wird abgefragt, anstatt es im Skript zu hinterlegen.
-Passwort-Übertragung und Download erfolgen über eine verschlüsselte Verbindung.
-Die Sicherungsdatei wird im gleichen Ordner abgelegt, in dem sich das Skript befindet. Der Dateiname kann in der untersten Zeile angepasst werden.

Um das Skript auszuführen, muss der unten stehende Code als ".ps1"-Datei abgespeichert werden und mit dem folgenden Befehl aufgerufen werden.
Code:
PowerShell -ep RemoteSigned -file "BEISPIEL.ps1"
Der Parameter "-ep RemoteSigned" ist notwendig, weil Powershell standardmäßig nur signierte Skripte zulässt.

Code:
# Skript um die Sicherungsdatei aus der Fritzbox 7270 per SSL herunterzuladen.

# Benutzer nach Fritzbox-Passwort fragen. –asSecureString versteckt die Eingabe, aber macht die folgenden beiden Befehle nötig,
# um das verschlüsselte Passwort wieder in Klartext zu verwandeln.
$passwort = Read-Host -Prompt "Bitte Fritzbox-Passwort eingeben" –asSecureString
$passwort = [System.Runtime.InteropServices.Marshal]::SecureStringToBSTR($passwort)
$passwort = [System.Runtime.InteropServices.Marshal]::PtrToStringAuto($passwort)


# Erstmal einen WebClient erzeugen, der später mit der Box spricht
$w=New-Object System.Net.WebClient

# Das Encoding sollte immer UTF8 sein.
$w.Encoding=[System.Text.Encoding]::UTF8


#TEIL1 SSL-port aus der Fritzbox auslesen

# Eine erste Abfrage ohne SSL
# Auch im http-Header muss stehen, dass die Kommunikation per UTF-8 kodiert ist
$w.Headers.Set("Content-Type", 'text/xml; charset="utf-8"')

# Der Funktionsaufruf kommt in den Header SOAPACTION
$w.Headers.Set("SOAPACTION", 'urn:dslforum-org:service:DeviceInfo:1#GetSecurityPort')

# Der SOAP-Aufruf wird in XML verpackt, und zwar...
# ... beginnt er mit einem immer gleichen Header.
$query='<?xml version="1.0"?>
        <s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/"
        s:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
        <s:Body> ' +
        # Dann kommt nochmal der Aufruf, diesmal steht der Funktionsname vorne
        '<u:GetSecurityPort xmlns:u="urn:dslforum-org:service:DeviceInfo:1">
        </u:GetSecurityPort>' +
        # Und das Ende ist auch immer gleich
        '</s:Body>
        </s:Envelope>'

# Diese XML-Abfrage schickt der Web-Client mit der Funktion UploadString an die Box.
# Der genaue URL gehört zum Service (siehe Artikel c't 6-2015)
# Die Typ-Umwandlung im XML macht aus der Antwort gleich eine Baumstruktur, ...
$r = [xml]$w.UploadString("http://fritz.box:49000/upnp/control/deviceinfo",$query)

# ... in der sich die gesuchte Information über ihren Namen ansprechen lässt.
# In diesem Falle ist das der Port, auf dem die Box einen SSL-gesicherten Zugang für SOAP bietet.
$port=$r.Envelope.Body.GetSecurityPortResponse.NewSecurityPort


#TEIL2 Config-Datei aus der Fritzbox herunterladen über eine verschlüsselte Verbindung

# Der WebClient enthält die Antowrt-Header aus der vorigen Abfrage. Daher diese neu setzen:
$w.Headers.Set("Content-Type", 'text/xml; charset="utf-8"')


# Der Funktionsaufruf kommt in den Header SOAPACTION Name der Funktion laut http://avm.de/fileadmin/user_upload/Global/Service/Schnittstellen/deviceconfigSCPD.pdf
$w.Headers.Set("SOAPACTION", 'urn:dslforum-org:service:DeviceConfig:1#X_AVM-DE_GetConfigFile')

# Der SOAP-Aufruf wird in XML verpackt, und zwar...
# ... beginnt er mit einem immer gleichen Header.

$query='<?xml version="1.0"?>
        <s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/"
        s:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
        <s:Body> ' +
        # Dann kommt nochmal der Aufruf, diesmal steht der Funktionsname vorne
        # Der mitgegebene Parameter steht innerhalb des Funktions-Tags
        # Hier wird mit NewX_AVM-DE_Password das Passwort der Fritzbox eingetragen
        '<u:X_AVM-DE_GetConfigFile xmlns:u="urn:dslforum-org:service:DeviceConfig:1">
        <NewX_AVM-DE_Password>$passwort</NewX_AVM-DE_Password>
        </u:X_AVM-DE_GetConfigFile>' +
        # Und das Ende ist auch immer gleich
        '</s:Body>
        </s:Envelope>'

# Der WebClient braucht nur die Zugangsdaten, dann wickelt er das Login ganz allein ab.
# dslf-config ist der im TR-64-Standard definierte Name.
$w.Credentials=New-Object System.Net.NetworkCredential("dslf-config",$passwort)

# Das SSL-Zertifikat der Box ist nicht so signiert, dass es der sehr genauen Prüfung im WebClient standhält.
# Daher würde keine Verbindung zu Stande kommen, wenn man nicht die  
# SSL-Zertifikatprüfung für diesen Prozess ausschaltet.
[System.Net.ServicePointManager]::ServerCertificateValidationCallback = {$true}

# Query abschicken. Diesmal sind drei Dinge anders:
# - https statt http
# - Der eben ermittelte Port statt 49000
# - Der URL zum Service (siehe Artikel)
$r = [xml]$w.UploadString("https://fritz.box:"+$port+"/upnp/control/deviceconfig",$query)


# ... in der sich die gesuchte Information über ihren Namen ansprechen lässt.
# In diesem Falle ist das der URL, unter der die Box die Sicherungdatei zum Download anbietet.
# Die Anführungszeichen bei X_AVM... sind nötig, weil sonst die Bindestriche als Operatoren interpretiert werden
$url=$r.Envelope.Body.'X_AVM-DE_GetConfigFileResponse'.'NewX_AVM-DE_ConfigFileUrl'

# Am Besten funktioniert der Download, wenn im WebClient keine Header gesetzt sind.
$w.Headers.Clear()

# Pfad des Skripts bestimmen; die Datei wird dann im gleichen Pfad gespeichert.
$Skriptpfad = Split-Path -Parent -Path $MyInvocation.MyCommand.Definition

# Herunterladen:
$w.DownloadFile( $url, $Skriptpfad+"\Fritzbox_7270_Sicherung.export")
 
Hallo.

zuerst einmal sorry für das Ausgraben dieses alten Beitrags, aber ich habe derzeit ein ähnliches Problem bzw. komme beim automatisierten Backup nicht weiter. Ich habe in einem Bash-Skript (unten angehängt) welches den gleichen Ansatz wie im vorherigen Beitrag verfolgt.

Folgendes Setup habe ich:

Bash:
# Login Data
BoxIP="fritz.box"
BoxUSER="MeinBenutzer"
BoxPW="MeinPasswort"

# Get Security Port
location="/upnp/control/deviceinfo"
uri="urn:dslforum-org:service:DeviceInfo:1"
action='GetSecurityPort'

securityPort=$(curl -s -k -m 5 --anyauth -u "$BoxUSER:$BoxPW" "http://$BoxIP:49000$location" -H 'Content-Type: text/xml; charset="utf-8"' -H "SoapAction:$uri#$action" -d "<?xml version='1.0' encoding='utf-8'?><s:Envelope s:encodingStyle='http://schemas.xmlsoap.org/soap/encoding/' xmlns:s='http://schemas.xmlsoap.org/soap/envelope/'><s:Body><u:$action xmlns:u='$uri'></u:$action></s:Body></s:Envelope>" | grep NewSecurityPort | awk -F">" '{print $2}' | awk -F"<" '{print $1}')
echo "$securityPort"

# Config File Download
location="/upnp/control/deviceconfig"
uri="urn:dslforum-org:service:DeviceConfig:1"
action='X_AVM-DE_GetConfigFile'
option2='testing'

curlOutput1=$(curl -s -k -m 5 --anyauth -u "$BoxUSER:$BoxPW" "https://$BoxIP:$securityPort$location" -H 'Content-Type: text/xml; charset="utf-8"' -H "SoapAction:$uri#$action" -d "<?xml version='1.0' encoding='utf-8'?><s:Envelope s:encodingStyle='http://schemas.xmlsoap.org/soap/encoding/' xmlns:s='http://schemas.xmlsoap.org/soap/envelope/'><s:Body><u:$action xmlns:u='$uri'><NewX_AVM-DE_Password>$option2</NewX_AVM-DE_Password></u:$action></s:Body></s:Envelope>")

echo "$curlOutput1"

Code Ausgabe
Bash:
49443
<und eine leere Zeile>

Es scheint so als bekäme ich vom zweiten SOAP call keine Antwort. Setze ich z.B. beim zweiten Call das Passwort auf einen leeren String (option2='') dann bekomme ich folgendes:

Code Ausgabe
Bash:
49443
<?xml version="1.0"?>
<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/" s:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
<s:Body>
<s:Fault>
<faultcode>s:Client</faultcode>
<faultstring>UPnPError</faultstring>
<detail>
<UPnPError xmlns="urn:dslforum-org:control-1-0">
<errorCode>402</errorCode>
<errorDescription>Invalid Args</errorDescription>
</UPnPError>
</detail>
</s:Fault>
</s:Body>
</s:Envelope>

Erwartet hätte ich die NewX_AVM-DE_ConfigFileUrl wie beschrieben in http://fritz.box:49000/deviceconfigSCPD.xml

XML:
<action>
<name>X_AVM-DE_GetConfigFile</name>
<argumentList>
<argument>
<name>NewX_AVM-DE_Password</name>
<direction>in</direction>
<relatedStateVariable>X_AVM-DE_Password</relatedStateVariable>
</argument>
<argument>
<name>NewX_AVM-DE_ConfigFileUrl</name>
<direction>out</direction>
<relatedStateVariable>X_AVM-DE_ConfigFileUrl</relatedStateVariable>
</argument>
</argumentList>
</action>

Hat zufällig jemand eine Idee an was es liegen könnte? Vielen Dank.
 
Zuletzt bearbeitet:
Holen Sie sich 3CX - völlig kostenlos!
Verbinden Sie Ihr Team und Ihre Kunden Telefonie Livechat Videokonferenzen

Gehostet oder selbst-verwaltet. Für bis zu 10 Nutzer dauerhaft kostenlos. Keine Kreditkartendetails erforderlich. Ohne Risiko testen.

3CX
Für diese E-Mail-Adresse besteht bereits ein 3CX-Konto. Sie werden zum Kundenportal weitergeleitet, wo Sie sich anmelden oder Ihr Passwort zurücksetzen können, falls Sie dieses vergessen haben.