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 Perl-Script, das den Kram automatisiert: Einmalig anpassen, starten, fertig.
#!/usr/bin/perl use strict; use warnings; use LWP::UserAgent; use Encode; use Digest::MD5 qw(md5_hex); my $ua = LWP::UserAgent->new; $ua->timeout(30); ### config section ### my $fritzpass = "<fritzbox password>"; my $httpuser = "<http auth user>"; my $httppass = "<http auth password>"; my $host = "<hostname or ip>"; my $mac = "<mac for wake up>"; # use mac format 01:23:45:67:89:AB ## uncomment the following line if you get ssl certificate warnings #$ua->ssl_opts(verify_hostname => 0); ### don't change anything below ### push @{$ua->requests_redirectable}, 'POST'; $ua->credentials($host.":443", "HTTPS Access", $httpuser, $httppass); my $url_base = "https://".$host; my $url_login = $url_base."/login.lua"; my $url_wakeup = $url_base."/cgi-bin/webcm"; my $r = $ua->get($url_login); if ($r->is_success) { my $c = $r->decoded_content; if ($c =~ m/var challenge = "([a-f0-9]+)";/) { my $challenge = $1; my %data = (response => sprintf "%s-%s", $challenge, md5_hex(encode("UTF16-LE", sprintf "%s-%s", $challenge, $fritzpass))); $r = $ua->post($url_login, \%data); $c = $r->decoded_content; if ($c =~ m/logout\.lua\?sid=([a-f0-9]+)/) { my $sid = $1; %data = (sid => $sid, "wakeup:settings/mac" => $mac); $r = $ua->post($url_wakeup, \%data); if ($r->is_success) { print "wakeup done.\n"; } else { printf "error: %s\n", $r->status_line; } } else { print "error: couldn't find a session id\n"; } } else { print "error: couldn't find a challenge\n"; } } else { print "error: couldn't login\n"; } exit 0;
Getestet wurde das Ganze mit einer FRITZ!Box 7170, also nicht gerade dem jüngsten Modell.













