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:
Ernsthaft? Full Quote des eigenen Beitrags für diese "nachgeschobene" Frage? Und das zu einem Zeitpunkt, wo seit der Fragestellung noch nicht mal drei Monate ins Land gegangen sind? Das muß ja wirklich dringend sein, wenn Du Dich jetzt schon wieder zu diesem Thema (erneut) meldest. *SCNR*

Vielleicht wäre ein (vernünftig formulierter) eigener Thread ja doch eine bessere Lösung? Vielleicht sogar einer, bei dem nicht im Thread-Titel ein FRITZ!Box-Modell auftaucht, das schon seit neun Jahren nicht mehr mit aktueller Firmware versorgt wird (und das gilt für die jüngste Version v3)?

Ideen haben die Leute hier sicherlich viele - und vermutlich könnten einige hier Dir sogar bei Deinem Problem helfen. Nur fühlen sich diese vermutlich gar nicht erst angesprochen - denn ich würde darauf wetten wollen, daß von den Leuten, die sich schon mal mit den TR-064-Schnittstellen von AVM auseinandergesetzt haben, nur die allerwenigsten noch eine 7270 in der Bastelkiste haben werden und HIER in diesem Thread niemand wirklich erkennen kann, daß sich Dein Problem gar nicht auf einen dieser Oldies bezieht.

So aus der Hüfte geschossen würde ich mal darauf tippen, daß Dein curl trotz -k-Option (bzw. --insecure) ein Problem mit dem TLS-Zertifikat der Box hat - aber das ist tatsächlich nur geraten. Was ich an dieser Stelle aber so GAR NICHT verstehe, ist: Wieso verwendet jemand, der OFFENSICHTLICH beim Aufruf eines Programms ein Problem bekommt, da die --silent-Option zum Unterdrücken aller Fehlernachrichten (die "progress meter"-Ausgabe läßt sich auch anders unterdrücken und findet ohnehin nur beim interaktiven Aufruf Verwendung)?

Was da schief läuft, dürfte Dir das curl in seiner Fehler-Ausgabe (STDERR bzw. File-Handle 2 in Shell) sehr deutlich mitteilen - und wenn Du DAMIT dann nichts anfangen kannst und Deine Recherche im Netz erfolglos verläuft, wird sich sicherlich auch jemand finden, der Dir dabei auf die Sprünge helfen kann (oder könnte). Nur bitte nicht in DIESEM Thread (ungeachtet Deiner einleitenden "Entschuldigung" fürs Exhumieren) ... und ich bin hier damit auch wieder raus (Fortsetzung meinerseits nur in einem passenden Thread).
 
Okay. Sorry für das Vollzitat. War in dem Fall völlig überflüssig.
Dann werde ich die silent option mal rausnehmen und schauen was da rauskommt. Sollte ich an der Stelle nicht weiterkommen mache ich einen neuen Beitrag auf.

Nur noch ein Wort: Dachte es wäre vielleicht sinnvoll in diesem Thread, da der ehemalige Thread-Ersteller vielleicht noch mitliest und mittlerweile mit einer neueren Box immer noch automatisierte Backups erstellt.
 
Okay. Danke für den Hinweis mit dem silent. Hatte ich bei anderen Abfragen mal gesetzt, da ich die Ausgabe nicht auf der Konsole haben wollte. Zum Debuggen aber sehr hilfreich. War in meinem Fall dass der cURL Aufruf für die Download URL in ein Timeout gelaufen ist.

Vielen Dank für den Schubser in die richtige Richtung.

Funktioniert jetzt so in meinem Fall mit:
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 URL
location="/upnp/control/deviceconfig"
uri="urn:dslforum-org:service:DeviceConfig:1"
action='X_AVM-DE_GetConfigFile'
option2='PasswortSicherung'

downloadURL=$(curl --connect-timeout 60 -k -m 60 --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>" | grep NewX_AVM-DE_ConfigFileUrl | awk -F">" '{print $2}' | awk -F"<" '{print $1}')

$(curl -k "$downloadURL" -o Sicherung.export --anyauth -u "$BoxUSER:$BoxPW")
 
Schön - da sich die verwendbaren Funktionen in PowerShell auch in den vergangenen knapp 9 Jahren massiv verändert haben (seit es diesen Thread gibt), habe ich hier: https://github.com/PeterPawn/YourFritz/blob/main/tr-064/GetConfigFile.ps1 mal noch eine PowerShell-Version als Beispiel eingecheckt, die auch mit aktuellen PS-Implementierungen funktioniert.

Wobei das nur aus dem internen LAN funktioniert, da die URL mit zufälligen Portnummern arbeitet (daher klappt das auch mittlerweile mit dem nur kurzzeitigen Bereitstellen der Datei für den Download) und darauf von der WAN-Seite nicht zugegriffen werden kann.
 
  • Like
Reaktionen: jhubig

Zurzeit aktive Besucher

Statistik des Forums

Themen
246,341
Beiträge
2,250,494
Mitglieder
373,997
Neuestes Mitglied
BerndBareth
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.