Comment allumer son ordinateur à distance en PHP ?

Envoyer un paquet magique pour utiliser le Wake On Lan.

21 août 2012

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.

Une question, un bug trouvé ou une suggestion ? N'hésitez pas à poster un commentaire.

Bonne chance.

Par
Créateur et administrateur.

Dans la même catégorie

PHP : formater un tableau en CSV
Comment envoyer un mail en ligne de commande ?
RSYNC : Comment synchroniser des fichiers à travers une connexion ssh ?
Exécuter un code PHP en ligne de commande
Doctrine 2 : générer les classes PHP depuis la base de données
Comment catcher les erreurs en PHP ?
Doctrine 2 : comment afficher la requête SQL ?
Comment construire une URL sans caractères spéciaux en PHP ?
Comment lister les fichiers PHP inclus sur ma page ?
Les fonctions anonymes récursives en PHP
Requête HTTP asynchrone en PHP
La résolution statique à la volée ou Late Static Bindings
Trouver les jours fériés français en PHP
Comment utiliser la balise meta viewport ?
Une version mobile de mon site avec le Zend Framework
Doctrine et le Zend Framework : Présentation, intégration et utilisation
Créer son flux RSS simplement avec Zend_Feed
Un client HTTP / proxy en PHP
Appliquer un layout sur un mail avec le Zend Framework
Activer PHP5 sur un hébergement 1&1
Comment lancer une requête multi-bases avec les fonctions MySQL ?
Implode / Explode : Du tableau à la chaine de caractères, de la chaine de caractères au tableau

Commentaire(s)