Script für Wake on LAN über FRITZ!Box (update)

Die meisten FRITZ!Box-Modelle bringen eine „Wake on Lan“-Funktion mit, über die sich ein ausgeschalteter Heimrechner starten läßt, wenn beispielsweise gerade Zugriff vom Büro aus notwendig ist. Solange der Rechner zu Hause am (verkabelten) LAN hängt, funktioniert das Ganze einwandfrei. Allerdings muß man sich auf der FRITZ!Box zunächst per HTTP-Auth und anschließend mit Admin-Paßwort anmelden, ins entsprechende Menü navigieren, dort den Rechner auswählen, der aufgeweckt werden soll, und schließlich den finalen Button drücken. Da das alles unglaublich viel Zeit frißt (bestimmt volle 1-2 Minuten!), hier ein PerlPython-Script, das den Kram automatisiert: Einmalig anpassen, starten, fertig.


Update:

Das Script liegt nun auf GitHub und wurde mit einer FRITZ!Box 7390, 7170 und 7112 getestet.

Tags:

35 Antworten zu “Script für Wake on LAN über FRITZ!Box (update)”

  1. Tristan says:

    Es wäre schön, wenn du das Script so umschreiben könntest, das es dich zur Eingabe des Usernames und der Passwörter bittet. Ich fühle mich nicht so richtig wohl, wenn ich diese sensiblen Daten in Klartext abspeichere. Vielleicht gibt es auch noch eine andere Möglichkeit. Trotzdem vielen Dank.

    Grüße Tristan

    AntwortenAntworten
  2. speaker says:

    @Tristan: Ich habe das Script angepaßt und eine entsprechende Abfrage eingebaut.

    AntwortenAntworten
  3. Tristan says:

    Vielen Dank. Noch schöner wäre natürlich eine Keychainabfrage wie beim Encfs Script von http://widerin.org/blog/secure-your-dropbox ;)

    AntwortenAntworten
  4. speaker says:

    @Tristan: Man kann’s auch übertreiben. ;)

    AntwortenAntworten
  5. Chris says:

    Hallo

    Eine super Idee dieses Script!

    Hab es sofort ausprobiert!Leider funktioniert es bei mir auf der 7390
    mit der aktuellen Firmware 84.05.50 nicht.

    Bekomme ständig die Meldung „login error“.

    Ich vermute,dass sich die Adressen der Websites geändert haben oder die
    Reihenfolge der Abfrage der Passwörter!

    Leider bin ich kein Perl und Fritzbix-Experte.

    Hat jemand Tipps?

    Vielen Dank für jeden Tipp

    AntwortenAntworten
  6. speaker says:

    @Chris: Hast du den Kommentar am Ende der Config-Sektion geprüft (SSL-Zertifikatsüberprüfung abschalten)?

    AntwortenAntworten
  7. Chris says:

    Hallo

    Ja, habe ich aktiviert bzw. die Kommentarraute entfernt. Zeile sieht so aus:

    $ua->ssl_opts(verify_hostname => 0);

    An der neuen Firmware liegts auch nicht. Habe die 84.05.05 und die 84.05.22 auch probiert. Leider ohne Erfolg. Mein Verdacht ist auch das Zertifikat, da laut Fritzbox Logs auch nie ein Login-Vorgang stattfindet. Das heisst, er müsste sich an der Zertifikatswarnung aufhängen (die kommt auch, wenn ich es manuell mache).

    Hast du noch eine Idee, bzw. einen Tipp für mich? Verzweifle langsam, weil das echt ne coole Sache wäre.

    Vielen Dank!

    AntwortenAntworten
  8. speaker says:

    @Chris: Ich habe das Script an die aktuelle 7390-Firmware angepaßt. Nun sollte alles funktionieren.

    AntwortenAntworten
  9. Chris says:

    Vielen Dank. Läuft jetzt alles super. Lag also doch an der Firmware und nicht am Zertifikat. Danke für den Support. Viele Grüsse!

    AntwortenAntworten
  10. extrafein says:

    Besten Dank für das tolle Skript. Funktioniert bestens!

    Da ich nicht den std.SSL Port verwende, ist mir noch ein kleiner Fehler aufgefallen:

    Zeile 50:
    alt> my $url_base = „https://“.$host;
    neu> my $url_base = „https://“.$host.“:“.$port;

    Nochmals Danke! Das Skript ist sehr hilfreich!

    AntwortenAntworten
  11. speaker says:

    @extrafein: Danke, eingefügt.

    AntwortenAntworten
  12. thanksalot says:

    Vielen Dank für das super Skript. Habe schon ewig nach einer Möglichkeit gesucht ohne Firmwaremod den Wakeonlan Befehl übers Internet auslösen zu können. Funktioniert übrigens auch mit der Fritz!Box 7360 SL mit Firmware 109.05.50.

    AntwortenAntworten
  13. joerghh says:

    Hmmm … Bei mir funzt es mit einer FB 7570 leider nicht.

    Läuft zwar durch und kommt mit „wakeup done“ zurück, aber im Ereignisprotokoll der Box erscheint ein „Anmeldung an der FRITZ!Box Benutzeroberfläche von IP-Adresse 12.34.56.78 gescheitert (falsches Kennwort).“

    Habe allerdings u. a. das Sonderzeichen $ in den Passwörtern. SSL-Port ist Standard 443.

    Irgendeine Idee?

    AntwortenAntworten
  14. speaker says:

    @joerghh: Sollte eigentlich funktionieren – mal das Kennwort überprüft? Es gibt bei einigen FBs unterschiedliche Paßwörter für die Anmeldung vom lokalen LAN und aus dem Internet. Letzteres erfordert bspw. noch einen Login-Namen.

    Ich habe mal ein aktualisiertes Script auf GitHub gepusht, URL siehe Artikel.

    AntwortenAntworten
  15. joerghh says:

    @speaker: Nee, funzt leider immer noch nicht :-( Weiterhin die selbe Meldung im Ereignisprotokoll wie zuvor –> siehe oben.

    Im neuen Script fehlt außerdem der Admin-Login, der bei meiner FB 7570 nach dem User-Login weiterhin benötigt wird.

    Ein manueller SSL-Login über Browser mit allen Daten funktioniert übrigens problemlos.

    AntwortenAntworten
  16. speaker says:

    @joerghh: Der Admin-Login war vorher bereits ohne Funktion, weil bei neueren FBs dieser nicht mehr gesondert benötigt wird.

    Ich habe gerade noch einmal das Script auf GitHub entsprechend angepaßt, bitte prüfen.

    AntwortenAntworten
  17. joerghh says:

    Ja, jetzt funktioniert’s. Klasse, dass Du Dir soviel Zeit für einen simplen „Vorbei-Surfer“ wie mich nimmst! War nur auf der Suche nach einem Script, mit dem ich von meinem Rootserver meinem PC Zuhause per WoL starten kann.

    Wahrscheinlich lag es wohl am fehlenden Admin-Login, welches meines FB benötigt.

    Nochmals vielen Dank! *thumbup*

    AntwortenAntworten
  18. Lars says:

    Tolle Idee, genau was ich gesucht habe.
    Was mir jedoch nicht ganz klar ist (Achtung, saudoofe Frage!): Wo liegt das Script und wie muss es aufgerufen werden?

    Ich wollte es auf meine Synology Diskstation packen und dort zeitgesteuert aufrufen lassen. Perl ist installiert, aber ich bekomme Fehlermeldungen und das Script bricht ab.

    AntwortenAntworten
  19. speaker says:

    @Lars: Der Ort, wo das Script liegt, ist völlig egal. Es kann mit „perl wakeup.pl“ gestartet werden.

    AntwortenAntworten
  20. Sid says:

    Super Script, habs grade per googeln gefunden und läuft auch wunderbar auf ner KD-Fritzbox (Cable 6490). Danke!!

    AntwortenAntworten
  21. hansland says:

    Hi!
    Vielen Dank für das schöne Script.
    Besteht eine Chance, das Script für eine FB6360 (Cable @KD) anzupassen?
    Habe einen eigenen User für WoL angelegt, es scheitert jedoch mit [login faileed]. SSL-Auth übergehe ich dabei.
    Vielen Dank vorab,
    Gruß, Alex

    AntwortenAntworten
  22. Julian says:

    Hi!
    Tolles Script, leider läuft es seit kurzem bei mir nicht mehr und bringt immer ein „[error] 404 Not Found“. Der remote Login und der local Login wird noch abgefragt, und dann kommt der 404.

    Meine Fritzbox is eine 7390 mit FritzOS 06.30

    Ich lasse automatische Updates machen, daher kann ich nicht sagen, ob es seit einem bestimmten Update nicht mehr geht, aber ich denke es fast.

    Danke im Voraus

    Achso, kleine Anmerkung: Die Ziele
    my $url_base = „https://“.$host;
    sollte eigentlich so heißen
    my $url_base = „https://“.$host.“:“.$port;
    damit man auch veränderte Ports benutzen kann.

    AntwortenAntworten
  23. speaker says:

    @Julian: Fixed. Kommentare zum Script bitte auf GitHub posten.

    AntwortenAntworten
  24. Julian says:

    Dank! Läuft wieder 1a!

    Das Script ist genial. Kein Freetzen oder Modden von der FB. Danke!

    Woher weißt Du / hast Du die Infos, wie Du das Fritzbox-Interface per LWP / web request steuerst?

    AntwortenAntworten
  25. speaker says:

    @Julian: Ich schaue mir halt an, was passiert, wenn ich manuell die entsprechenden Buttons klicke, und bastel das dann nach. ;)

    AntwortenAntworten
  26. Julian says:

    Danke, dass Du das Script immer up-2-date hältst!!!

    AntwortenAntworten
  27. Bejobe says:

    Danke für das Script auf https://github.com/n0rc/fritzbox/blob/master/wakeup.py

    In Zeile 84 des Scripts wakeup.py muss es statt
    if ‚“pid“: „netDev“‚ in r.content:
    heissen
    if ‚“pid“:“netDev“‚ in r.content:
    (Es ist ein Leerzeichen zu viel.)
    Dann kann man auch true/false abfragen bzw success ermitteln.

    AntwortenAntworten
  28. speaker says:

    @Bejobe: Stimmt, danke (obwohl deine Quotes kaputt sind ;)). In Zukunft bitte einfach einen PR auf GitHub stellen.

    AntwortenAntworten
  29. Bejobe says:

    @speaker
    – Das mit den „kaputten Quotes“ sah ich natürlich auch, aber die „kaputten Quotes“ entstanden automatsch, nachdem ich den Kommentar-Editor durch Absenden verlassen hatte. Als ich meinen Kommentar danach (innerhalb der ersten 4 Minuten nach den Erstellen des Kommentars) noch einmal editierte, waren die normalen Quotes wieder da (das musste auch so sein, denn ich hatte direkt aus wakeup,py kopiert) und wurden wieder automatisch kaputt gemacht als ich abspeicherte.
    – Fand die Kommentarfunktion auf GitHub nicht. Hole das jetzt aber noch nach, weil es mich interessiert wie es funktioniert und abgewickelt wird.

    Nochmal Lob und Dank für das Script wakeup.py

    Edit: ist jetzt wieder passiert: Quotes gewandelt

    AntwortenAntworten
  30. speaker says:

    @Bejobe: Ja, das mit den Quotes ist anscheinend irgendeine tolle Blog-Funktion… :D Ich hab mal ein bißchen Refactoring gemacht und den Config-Krempel im Script nun ausgelagert.

    AntwortenAntworten
  31. Bejobe says:

    wakeup.json wuede ich wieder ausbauen (oder nur optional lassen).

    Für mich war es wichtig als ich das Script fand, dass es so einfach zu lesen war.

    Und ich lese jetzt hier sowieso alle Parameter im meiner Variante des Scripts über die Kommandozeile ein.

    Das Bestimmen der gewünschten MACs und der Daten der verschiedenen Fritzboxen ist für mich viel flexibler in einem Shellscript zu handhaben. Da kann ich dann verschiedenste Systeme aufwecken und habe die Vorbereitungen der Aufrufe (MACs, Fritzboxen-Daten) und wakeup.py selbst streng getrennt.

    HOST = sys.argv[1]

    USERNAME = sys.argv[4]
    if USERNAME == ‚.‘:
    USERNAME = “

    Wie gesagt: Für mich war es wichtig als ich das Script fand, dass es so einfach zu lesen war.

    PS.: Quoting und Einrückungen geschenkt… ;-)

    AntwortenAntworten
  32. speaker says:

    @Bejobe: Inwiefern ist das Script jetzt schwer zu lesen? Du kannst gern deine Vorlieben in deinem Fork umsetzen, dafür ist es ja öffentlich.

    AntwortenAntworten
  33. Bejobe says:

    Vorher standen die relevanten Variablen einfach fix (klatsch klatsch klatsch) oben hintereinander. Jetzt irgendwo unten und grösstenteil gar nicht mehr, sondern werden via „config“ übergeben. Pfui Spinne würde Kalle Blomquist sagen. Unübersichtlich. Ich mag das gar nicht.

    AntwortenAntworten
  34. Bejobe says:

    Meine eigenen Variante ist nicht massentauglich, weil _alle_ Parameter in der genau richtigen Reihenfolge auf der Kommandozeile erwartet werden und das überhaupt nicht geprüft wird.

    Versteh es nicht falsch: Für ein eigenes einzelnes Script ist die json-Variante ok. Auch für uninformierte User, die das Script so übernehmen wollen.

    Aber als Basis für Weiterentwicklungen ist es so unübersichtlich.

    Ich stelle mal eine Kommandozeilenvariante bereit….

    AntwortenAntworten
  35. speaker says:

    @Bejobe: Mein Fokus liegt darauf, daß man erstens möglichst viel vom Script wiederverwenden können soll und zweitens wenig Aufwand hat, das Script einzusetzen – deshalb läßt es sich bspw. jetzt auch besser als Modul verwenden.

    Wenn dir Einzelaspekte nicht passen, wie ich sie jetzt gebaut habe, ist das dein gutes Recht – bau es dir halt so, wie du es gut findest. Aber du solltest mal ein bißchen reflektieren, was du hier so schreibst: Leute sind gleich „uninformierte User“, wenn sie das Script so übernehmen? Das Ganze ist „für Weiterentwicklungen (…) unübersichtlich“? Hast du überhaupt schon mal Python-Module gebaut und wiederverwendet?

    Die gesamte Config als Parameter zu übergeben, wie du das gerne möchtest, ist jetzt immer noch sehr einfach umzusetzen und dabei um einiges robuster als vorher, da im Script relativ selbsterklärend argparse eingesetzt wird. Wenn du dir das mal genauer anschaust, wirst du sehen, daß das ziemlich komfortabel genau das leistet, was du willst. Du kannst halt einfach deine weiteren Parameter dazubasteln.

    Das nächste Mal würde ich mir an deiner Stelle ein bißchen zurückhaltender erstmal anschauen, was da wie benutzt wird, und damit ein bißchen rumprobieren, bevor ich gleich auf alles verbal draufhaue, was nicht mehr so ist, wie ich es gern hätte (oder wie ich es vllt. nur kenne). Alles andere ist nämlich ziemlich unfair Leuten gegenüber, die kostenlos Code bereitstellen.

    Ansonsten hindert dich auch weiterhin niemand daran, einfach den letzten Commit vor den Änderungen zu verwenden.

    AntwortenAntworten

Eine Antwort hinterlassen