Comment allumer son ordinateur à distance en PHP ?

Envoyer un paquet magique pour utiliser le Wake On Lan.

Le Wake On Lan (WOL) est une technique employée pour démarrer un ordinateur à distance. Lorsque la carte mère et la carte réseau de la cible supportent le wake on lan et qu'il est activé dans le BIOS, il suffit d'envoyer un paquet vers cette cible pour qu'elle démarre.

Vous n'apprendrez pas ici comment activé le WOL sur votre machine, il existe des centaines de façons différentes de le faire selon le constructeur et la technologie employée. Il est presque sûr que tout est écrit dans le manuel, que vous n'avez jamais lu, fournit avec votre machine. Personnellement je n'ai rien eu à faire sur ma machine, tout était déjà activé. Pour voir si le wake on lan est activé c'est très simple : éteignez votre machine et regardez votre routeur, s'il y a encore une lumière, ce doit être bon. Attention, il est normal de ne pas avoir de lumière sur le port RJ45 côté machine.

Ce tutoriel a pour but d'expliquer comment envoyer le paquet magique qui déclenchera l'allumage à distance de la cible. Ce qu'il faut savoir :

  • Vous devez connaître l'adresse MAC (adresse physique) de la machine : ipconfig /all pour Windows ou ifconfig pour Linux
  • Vous devez connaître le réseau sur lequel se situe la cible.
  • Le paquet doit être envoyé sur les ports UDP 0, 7 ou 9. Bien souvent c'est le 7 qui est utilisé.
  • Le paquet commence par 6 fois l'octet (le caractère) FF.
  • Ensuite il contient 16 fois l'adresse MAC.

Envoyer un paquet magique

class WolException extends Exception {} class Wol { public static function envoyerPaquet($mac, $ip = '255.255.255.255', $port = 7) { /* * Transformation de l'adresse mac pour avoir sa version en octets * et sans les :. */ $mac = preg_replace_callback ('/[0-9A-F]{2}/i', create_function ('$m', 'return (chr(hexdec($m[0])));'), $mac); $mac = str_replace(':', '', $mac); /* * Debut du paquet : FF FF FF FF FF FF */ $buffer = str_repeat (chr (0xFF), 6); /* * Repetition de 16 fois l'adresse MAC. */ $buffer .= str_repeat ($mac, 16); /* * Envoie du paquet. AF_INET : IPV4 * SOCK_DGRAM : Support des datagrammes. * SOL_UDP : Utilisation d'UDP */ if (! ($socket = socket_create (AF_INET, SOCK_DGRAM, SOL_UDP))) throw new WolException ('Impossible de creer la socket'); /* * Le 1 correspond a ICMP = getprotobyname('icmp'). * Le TRUE active le broadcast. */ if (! socket_set_option ($socket, 1, SO_BROADCAST, true)) throw new WolException ('Impossible de configurer la socket.'); /* * 102 est la taille du buffer : 6 + 6 * 16 */ if (socket_sendto ($socket, $buffer, 102, 0, $ip, $port) === false) throw new WolException ("Impossible d'envoyer des donnees a la socket."); socket_close ($socket); } } /* Utilisation */ Wol::envoyerPaquet ('XX:XX:XX:XX:XX:XX');

Ce script a été développé et testé sous WAMP et Debian Squeeze. Vous pouvez le faire fonctionner depuis internet, à condition de rediriger tout ce qui arrive sur le port 7 du routeur vers la machine cible.