AVM FRITZ!Box automatisch neu starten (lassen)

Eine FRITZ!Box kann eine feine Sache sein, aber so manchmal gibt’s auch kleine Makel, wie z.B. diesen: Bei einem Kunden streikt schon fast regelmässig das WLAN.

Oft geht die Performance zurück und manchmal bleiben Geräte als Verbunden “hängen”, obwohl diese nicht mal mehr ansatzweise in der Nähe sind (Live beobachtet z.B. mit meinem Notebook als auch mit diversen Smartphones und Tablets). Helfen tut in aller Regel ein Neustart.

Nun ist es lästig alle paar Tage sich mit dem Webinterface verbinden zu dürfen, um einen Neustart auszulösen. Unterm Tag ist das zwecks “arbeiten können” sowieso eher ungut. Abhilfe schafft das Auslösen des Neustarts z.B. von einem sowieso immer laufenden System aus wieetwa Server, NAS oder ähnliches.

Im Netz kursieren hierzu viele Beispiele. Wichtig ist, dass das verwendete Skript mit aktuellen Firmware-Versionen funktioniert. Ältere Skripte die auf die WEBCM-Schnittstelle setzen, können nicht mehr angewendet werden. Eine weitere Möglichkeit wäre telnet zu verwenden, sofern man es vorher aktiviert, allerdings wird dies seit Version 6.25 nicht mehr unterstützt. Ohne größere Umwege geht es über das Router-Verwaltungsprotokoll TR-064.

Ein sehr schönes und leicht zu verstehendes Skript für Linux liefert Nico Hartung:

loggn.de – FRITZ!Box oder Repeater automatisch neustarten lassen – Linux Bash-Skript

GitHub – cron_fritzbox-reboot – FRITZ!Box Neustart Skript – jede Nacht, einmal die Woche, wie ihr wollt

Bei meinen Tests klappte das Auslösen eines Neustarts aber nur mit einem Benutzer, der FRITZ!Box-Einstellungen ändern darf. Nur mit dem Weboberflächen-Kennwort allein kommt folgende Fehlermeldung:

<?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>606</errorCode>
<errorDescription>Action Not Authorized</errorDescription>
</UPnPError>
</detail>
</s:Fault>
</s:Body>
</s:Envelope>

Dieses Verhalten ist bekannt:

Authentifizierung nicht möglich

Dokumentation der FRITZUSER Variable verbessern

D.h. in neueren Firmware-Versionen kann man den Fritz!Box-Benutzernamen, der automatisch angelegt wird und für den das voreingestellte oder selbst konfigurierte Kennwort gilt, auslesen:

Alternativ einen neuen FRITZ!Box-Benutzer anlegen, bei diesem den Haken setzen bei

  • FRITZ!Box Einstellungen
    Benutzer mit dieser Berechtigung können alle Einstellungen der FRITZ!Box sehen und bearbeiten.

Diese Zugangsdaten dann in das Skript bei den entsprechenden Variablen eintragen.

FreeBSD / pfSense

Das Skript lässt sich nahezu unverändert unter FreeBSD bzw. pfSense verwenden. Man muss lediglich die erste Zeile von

#!/bin/bash

zu

#!/bin/sh

ändern und vor “curl…” (Zeile 36) noch den Pfad “/usr/local/bin/” einfügen, andernfalls funktioniert es mittels cron/crontab unter FreeBSD nicht:

/usr/local/bin/curl -k -m 5 --anyauth...

Den richtigen Pfad zu curl kann man mittels

which curl

ermitteln.

Quellen:

serverfault – Curl don’t work on cron execution [duplicate]

LinuxQuestions.org – Curl utility doesnt work on freebsd crontab

Apropos pfSense: Beim besagten Kunden läuft eine pfSense, die dort lediglich als OpenVPN-Server dient. Das Skript kann man einfach via (Win)SCP im Pfad

/usr/local/etc/

ablegen und mittels ssh noch ausführbar machen:

chmod 0755 /usr/local/etc/fritzbox-reboot.sh

ssh muss für beides (natürlich) vorher in pfSense aktiviert sein. Mit der Cron-Erweiterung kann der Zeitpunkt für den automatischen Neustart via Web-Interface bequem geplant werden. Ein Beispiel für täglich 04:30 Uhr:

Was ist mit Windows?

Gerne hätte ich eine Lösung für Windows, da man nicht überall etwas unixoides vorfindet. Bei der Recherche bin ich über ein Powershell-Skript gestolpert:

Administrator.de – Powershell: FritzBox über TR-064 im Netzwerk konfigurieren und auslesen

Leider lies sich dieses nicht erfolgreich ausführen. Sozusagen als Plan B habe ich dann versucht den curl-Befehl vom zuvor genannten Skript unter Windows zum Laufen zu bekommen.

Also erstmal curl für Windows heruntergeladen, entpackt und im bin-Ordner das Skript als Windows-Batch hinterlegt und natürlich OS-bedingt geändert. Dieses sieht aktuell so aus:

@echo off

set IP=192.168.178.1
set FRITZUSER=<Benutzername>
set FRITZPW=<Kennwort>

set location=/upnp/control/deviceconfig
set uri=urn:dslforum-org:service:DeviceConfig:1
set action=Reboot

curl -k -m 5 --anyauth -u %FRITZUSER%:%FRITZPW% http://%IP%: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:Reboot xmlns:u='urn:dslforum-org:service:DeviceConfig:1'^>^</u:Reboot^>^</s:Body^>^</s:Envelope^> -s > output.log 2>&1

Leider meldet die FritzBox immer dieses zurück:

<HTML>
<HEAD>
<TITLE>500 Internal Server Error (ERR_INVALID_REQ)</TITLE>
</HEAD>
<BODY>
<H1>500 Internal Server Error</H1>
<BR>ERR_INVALID_REQ<HR>
<B>Webserver</B> Wed, 20 Feb 2019 13:04:50 GMT
</BODY>
</HTML>

Mit anderen Worten: Es klappt nicht. Auch dann nicht, wenn man alles (ohne Variablen) in eine Zeile packt. Seltsam finde ich, das der Aufruf, wenn man sich diesen mittels echo sowohl unter Linux als auch Windows anzeigen lässt identisch aussieht:

Linux:

curl -k -m 5 --anyauth -u <Benutzername>:<Kennwort> http://192.168.178.1:49000/upnp/control/deviceconfig -H Content-Type: text/xml; charset="utf-8" -H SoapAction:urn:dslforum-org:service:DeviceConfig:1#Reboot -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:Reboot xmlns:u='urn:dslforum-org:service:DeviceConfig:1'></u:Reboot></s:Body></s:Envelope> -s

Windows:

curl -k -m 5 --anyauth -u <Benutzername>:<Kennwort> http://192.168.178.1:49000/upnp/control/deviceconfig -H Content-Type: text/xml; charset="utf-8" -H SoapAction:urn:dslforum-org:service:DeviceConfig:1#Reboot -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:Reboot xmlns:u='urn:dslforum-org:service:DeviceConfig:1'></u:Reboot></s:Body></s:Envelope> -s

Evtl. hat ja noch jemand einen Tipp 😉

Update 25.02.2019

Beitrag um Pfad-Erweiterung im Skript für FreeBSD/pfSense und cron/crontab ergänzt.

Update 21.11.2019

Der Denkanstoss von Hawker in Sachen “Neustart via Windows” (siehe Kommentare) hat geholfen. Danke dafür!

Als Einzeiler funktioniert dieses hier:

curl -k -m 5 --anyauth -u <Benutzername>:<Kennwort> http://192.168.178.1:49000/upnp/control/deviceconfig -H "Content-Type: text/xml; charset="utf-8"" -H "SoapAction:urn:dslforum-org:service:DeviceConfig:1#Reboot" -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:Reboot xmlns:u='urn:dslforum-org:service:DeviceConfig:1'></u:Reboot></s:Body></s:Envelope>" -s

Und als Skript dann so:

@echo off

set IP=192.168.178.1
set FRITZUSER=<Benutzername>
set FRITZPW=<Kennwort>
set location=/upnp/control/deviceconfig
set uri=urn:dslforum-org:service:DeviceConfig:1
set action=Reboot

curl -k -m 5 --anyauth -u "%FRITZUSER%:%FRITZPW%" http://%IP%: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:Reboot xmlns:u='urn:dslforum-org:service:DeviceConfig:1'></u:Reboot></s:Body></s:Envelope>" -s > output.log 2>&1

Update 16.12.2021

Kleinere Ergänzungen.

27 Kommentare

  1. Peter

    Nimm doch eine steuer-/programmierbare Steckdose.

  2. andy

    Das wäre auch eine Option.

  3. Daniel

    Wie wäre es denn mit dem Linux Subsystem für Windows 10 ? Damit könnte man evtl das Skript ausführen.

  4. andy

    Ist ein Gedanke, aber nicht überall findet man Windows 10 bislang vor, noch dazu müsste dieses System dann zum Zeitpunkt des gewünschten Neustarts laufen.

  5. Daniel

    Habe dass hier noch gefunden.

    https://www.ip-phone-forum.de/threads/fritzbox-7170-automatisch-nachts-neustarten-lassen.212261/

    Ich weiss allerdings nicht, ob dass bei jeder bzw aktuellen FB noch geht.

  6. andy

    Mit der Tastenkombi hatte ich es sogar bei meiner privaten FritzBox zu allererst versucht, das klappte allerdings nicht. Daher hatte ich das nicht weiter verfolgt.

  7. Julian

    Wie genau kann das auf einer Synology NAS ausgeführt werden?

  8. andy

    Hallo Julian,

    das Original-Skript von Nico müsste sich als Aufgabe (Cronjob) von der Synology aus starten lassen.
    Dazu das Skript z.B. via ssh/scp auf das NAS kopieren, ausführbar machen, anpassen (Benutzernamen, Kennwort,…), am besten min. einmal manuell testen und schließlich als Aufgabe planen:

    Am NAS anmelden.
    Auf „Systemsteuerung“ klicken.
    Im Abschnitt „System“ auf „Aufgabenplanuer“ klicken.
    Auf „Erstellen – Geplante Aufgabe – Benutzerdefiniertes Skript“ klicken.
    Bei „Vorgang“ einen Namen vergeben.
    Bei „Zeitplan“ die gewünschten Zeiten einstellen.
    Bei „Aufgabeneinstellung“ unter „Befehl ausführen“ Pfad und Skriptname eintragen.

  9. Julian

    Danke für die Info! Hat einwandfrei geklappt.
    Auch die Repeater starten neu. 🙂

  10. Mollet

    Der Reboot funktioniert mit deinem Script auch auf einer Synology. Ich habe jedoch keine Verbindung mit dem Standartbenutzer der Fritzbox herstellen können. Ich habe dazu auf meiner 6590 einen weiteren Benutzer “reboot” angelegt und dem auch ein Passwort gegeben, Zugriff nur auf die FB (natürlich nicht von aussen). Dann in deinem script eingefügt. Auf mein NAS verbunden per ssh als admin. script in var/tmp abgelegt mit winscp. Mit chmod ausführbar gemacht. Nochmal mit vim geschaut ob alles korrekt formatiert ist. Der Behehl ist :ff=unix, dann abgespeichert und einmal manuell getestet und dann nochmals über die Aufgabenverwaltung.

    Eine alternative für Windows wäre noch ein Makro zu benutzen, ich habe von jitbit mal den Makro recorder Pro gekauft, damit kann man den kompletten reboot prozess via Maus und Tastatur aufzeichnen, eine exe Datei daraus machen und dann eben im Taskplaner einbauen. Ich weis natürlich das dies nicht so elegant ist, aber es ist eine Möglichkeit.

  11. Hawker

    Unter Wondows muss mal leider ein paar mehr Anführungszeichen spendieren.

    So läuft es bei mir auch unter Windows:

    curl -k -m 5 –anyauth -u “:” :49000/upnp/control/deviceconfig -H “Content-Type: text/xml; charset=”utf-8″” -H “SoapAction:urn:dslforum-org:service:DeviceConfig:1#Reboot” -d “” -s

  12. Hawker

    Da wurden leider die Platzhalter verschluckt. Daher noch ein Versuch.

    Windows:
    curl -k -m 5 –anyauth -u “user:password” http://ip:49000/upnp/control/deviceconfig -H “Content-Type: text/xml; charset=”utf-8″” -H “SoapAction:urn:dslforum-org:service:DeviceConfig:1#Reboot” -d “” -s

  13. Andy

    Danke für den Tipp. Habe es gerade mal gegenüber meiner 7490 getestet. Leider ohne Erfolg:

    UPnPError
    502
    XML error

  14. Hawker

    Die Kommentarfunktion zerstört leider alles was aussieht wie ein HTML-Tag also auch XML und die Anführungszeichen gehen auch kaputt. Ich habs mal auf pastebin gepackt: https://pastebin.com/kKj3dwvU

  15. Andy

    Das mit den Kommentaren habe ich leider auch gerade gemerkt, war gerade dabei den Beitrag zu aktualisieren als deine “Pastebin”-Antwort kam. Jednefalls war dein Denkanstoß genau richtig, danke dafür.

  16. plao

    Toll! Vielen Dank!

  17. plao

    @Hawker: wollte mich auf Pastebin mit dir herzlich bedanken, aber “NO WAY”…dann, ich bedanke mich hier. Auch das Skript unter Linux funktioniert reibungslos! KLASSE!!!

  18. Gert

    Analoge oder digitale Zeitschaltuhr verwenden. Täglich z.B 4:55 Uhr ausschalten und 5:00 Uhr einschalten. Die Firmware-Aktualisierung der FritzBox sollte immer manuell geflasht werden, natürlich nicht zwischen 4:55 – 5:00 Uhr.

  19. Thomas

    Hi, @ Mollet,
    mit Interesse habe ich den obigen Verlauf gelesen.
    In meinem Netzwerk befindet sich eine FritzBox Cable 6490 und ein Synology NAS.
    Eine Aufgabe anzulegen habe ich hinbekommen.
    Diese habe ich als ‘root’ erstellt.
    Mir ist aber leider vollkommen unklr wie ich das mit dem Skript machen soll.
    Vor allem welches müsste ich nehmen.
    Die FritzBox soll abends neu starten, da die Kanäle immer belegt sind.
    Leider scheint die FB hier ein Problem zu haben.
    Es wird nie der gewählte auto Kanal gewechsel. Egal wie viele andere Wlan im Bereich auftauchen.
    Über eine Hilfestellung würde ich mich sehr freuen.
    vg
    Thomas

  20. Andy

    Das Linux-Skript von Nico (siehe die Links zu Loggn.de und GitHub) muss auf das Synology NAS (bspwl. ssh aktivieren, per scp übertragen)
    Im Skript dann noch IP, Benutzername und Kennwort der FB eintragen.
    Das Skript ausführbar machen (chmod…) und via cron/crontab/GUI dann planen.

    Soweit die Kurzfassung. Hab’ ich allerdings auf einem NAS noch nicht gemacht, sollte allerdings lösbar sein.

  21. jacktaurin

    Moin, nachdem mich das Skriptausführen auf der Synology ein paar Nerven gekostet hat. Hier meine vllt simplere Lösung. Das Skript einfach per copy paste direkt als benutzerdefiniertes Skript in der Aufgabe eintragen und es läuft 😉
    Spricht doch nichts gegen oder? VG

  22. Muggi

    Hallo zusammen,

    versuche das Skript über meinen Synology NAS zu starten.

    Jedoch kommt in den Ereignissen der Fritte folgende Fehlermeldung:
    Anmeldung einer App mit unbekanntem Anmeldenamen von IP-Adresse 192.168.1.5 gescheitert.
    192.168.1.5 ist der NAS.
    In beiden Fritzboxen ist der Zugriff für Anwendungen zulassen aktiviert. User und Passwort sind ebenfalls richtig.
    Habe extra einen User restart angelegt mit passwort. Kann mich auch darüber auf den Boxen anmelden.
    Habe hier 2 Fritzboxen die ich gerne neustarten würde, die 7530 (FritzOS 7.21) ist hinter einer 6591 Cable (FritzOS 7.13) von unitymedia-vodafone.

    Hoffe ihr könnt mir helfen.

  23. Andy

    Sofern das Kennwort Sonderzeichen enthält mal ohne diese, d.h. nur Groß-/Kleinbuchstaben und Zahlen, versuchen.
    Ansonsten wäre die Ausgabe des Befehls bzw. Skripts direkt in der Shell interessant.
    Dazu müsste man sich mal per ssh mit dem NAS verbinden und das Skript ausführen.

  24. peter

    Guten Tag,
    sowas würde ich auch gerne machen! Mein Netzwerk enthält 2 FB7590 Basis und Repeater mit W-Lan Brücke als Verbindung. Am Repeater hängt ein NAS (QNAP TS253A)
    Wie bekomme ich das nun auf die reihe, die FB’s einmal im Monat neu zu starten?
    Ist die Beschriebene fpsens notwendig oder nicht?

  25. Andy

    Hallo Peter,

    die Lösung sollte auch unter Linux funktionieren. Ob man damit einen Repeater neustarten kann weiß ich leider nicht. pfSense ist nicht zwingend erforderlich. Ich gehe einfach mal davon aus, das man das Skript auch irgendwie unter Qnap zum Laufen bekommt, da fehlt es mir allerdings an Erfahrung.

  26. Ahrens

    Also bei meiner 7582 ios 7.17 funktioniert nichts von dem allem, Sytaxfehler oder gar keine Reaktion

  27. Peter

    Danke, bei meiner Fritz 7530 funktioniert es mit curl unter Windows10 einwandfrei.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

© 2024 Andy's Blog

Theme von Anders NorénHoch ↑