Rechner aufwecken via PHP und Wake-On-LAN
Wenn man den Server im Keller nachts herunterfährt und morgens keine Lust hat runterzulaufen (vorausgesetzt man schläft oder arbeitet nicht im Keller), kommt man schnell auf die Idee den Diener im Untergeschoss aus der Ferne aufzuwecken. Dank Wake-On-LAN in Form eines Magic Packets ist das auch einfach möglich wenn es der Rechner den man aufwecken möchte unterstützt, und der Zielrechner in netzwerktechnischer Nähe steht.
Ein Magic Packet ist ein speziell präpariertes UDP-Paket das den Weckbefehl enthält. Der Zielrechner muss den Empfang unterstützen und demnach auch wenn er ausgeschaltet ist auf Netzwerkpakete reagieren. Wenn der Rechner nicht allzu alt ist sollte er das auch beherrschen.
Was benötigt man für den Weckruf? Wir konstruieren uns ein UDP-Paket mit 6 Mal hexadezimal FF und danach 16 Mal die MAC-Adresse der Netzwerkkarte. Dieses Paket schicken wir dann entweder direkt an die IP-Adresse der Netzwerkkarte oder per Broadcast ins Netzwerk, Hauptsache die Netzwerkkarte bekommt das Paket mit und erkennt den Inhalt als WOL-Befehl.
Ich habe eine kleine Klasse geschrieben und sie auf GitHub geladen. Benutzt wird sie wie folgt:
<?php
require_once __DIR__.'/../PHPGangsta/WakeOnLAN.php';
\PHPGangsta\WakeOnLAN::wakeUp('40:61:86:38:3D:11', '192.168.1.255');
Die Klasse sieht dann so aus:
<?php
namespace PHPGangsta;
class WakeOnLAN
{
public static function wakeUp($macAddressHexadecimal, $broadcastAddress)
{
$macAddressHexadecimal = str_replace(':', '', $macAddressHexadecimal);
// check if $macAddress is a valid mac address
if (!ctype_xdigit($macAddressHexadecimal)) {
throw new \Exception('Mac address invalid, only 0-9 and a-f are allowed');
}
$macAddressBinary = pack('H12', $macAddressHexadecimal);
$magicPacket = str_repeat(chr(0xff), 6).str_repeat($macAddressBinary, 16);
if (!$fp = fsockopen('udp://' . $broadcastAddress, 7, $errno, $errstr, 2)) {
throw new \Exception("Cannot open UDP socket: {$errstr}", $errno);
}
fputs($fp, $magicPacket);
fclose($fp);
}
}
Nutzen kann man das ganze übrigens auch wenn man eine Fritzbox (oder einen anderen Rechner zuhause hat) der aus dem Internet erreichbar ist, und der Zielrechner zuhause ausgeschaltet ist von dem man gerade ganz dringend Daten braucht, oder per Teamviewer drauf muss. Dann wählt man sich zuhause ein auf einem laufenden Gerät mit installiertem PHP und schickt das magische Paket. Und schon ist der Rechner an.
Nette kleine Klasse. Machst du dafür auch eine composer.json Datei mit PSR-0 Support?
Christian Münch
3 Sep 12 at 10:53
„vorausgesetzt man [..] arbeitet nicht im Keller“
Hey auf was willst du hinaus, hier unten isses im sommer schön kühl und im winter ist es dank server schön warm^^
achja und auf den Monitor scheinende Sonne gibts auch nicht 😛
Wasrun
3 Sep 12 at 17:08
@Christian Münch: Selbst ist der Mann, forken, hinzufügen, Pull-Request! Wäre es dann evtl. auch besser einen „lib“ Ordner zu erstellen?
Falls ich bis morgen Abend keinen Pull-Request von dir habe versuche ich es selbst.
Einen Pull-Request gab es heute bereits: ctype_xdigit() und bessere Exception.
Michael Kliewe
3 Sep 12 at 19:07
Auch wenn’s etwas off-topic ist muss ich das mal loswerden: Es ist doch echt der Wahnsinn wie schnell sich dieses ganze PSR-0,1 und 2 etabliert hat, oder ? Ich mein, 10+ Jahre lang hat die PHP Community weltweit komplett wild durcheinanderprogrammiert als gäb’s kein Morgen, und urplötzlich liest man an jeder Ecke extrem sauberen, standardkonformen Code dessen Definition eigentlich so erst vor wenigen Monaten veröffentlicht wurde. Eine sehr gute Entwicklung, im wahrsten Sinne.
Chris
3 Sep 12 at 23:40
Hab mal Pull-Request gemacht. Hoffe es funktioniert. Bitte license und autors usw. selber noch anpassen wo nötig.
Mike Meier
12 Nov 12 at 16:16
[…] [6] – Wiki, Wake on LAN [7] – Wake On LAN per PHP Script [8] – Alternativ PHP Script 1 [9] – Alternativ PHP Script 2 [10] – Wir bauen uns einen eigenen Dyn DNS Dienst – […]
Ferner Weckruf | thomast.de
18 Nov 13 at 21:25