Wake on LAN скрипт, который работает
Есть ли сценарий Wake On Lan с использованием веб-языка, предпочтительно PHP, который работает? Также тот, который имеет некоторую документацию о том, как заставить это работать как то, что должно быть включено на вашем сервере и т.д.
5 ответов
function wol($broadcast, $mac)
{
$mac_array = split(':', $mac);
$hwaddr = '';
foreach($mac_array AS $octet)
{
$hwaddr .= chr(hexdec($octet));
}
// Create Magic Packet
$packet = '';
for ($i = 1; $i <= 6; $i++)
{
$packet .= chr(255);
}
for ($i = 1; $i <= 16; $i++)
{
$packet .= $hwaddr;
}
$sock = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP);
if ($sock)
{
$options = socket_set_option($sock, SOL_SOCKET, SO_BROADCAST, true);
if ($options >=0)
{
$e = socket_sendto($sock, $packet, strlen($packet), 0, $broadcast, 7);
socket_close($sock);
}
}
}
Должно работать - звоните с широковещательным IP-адресом и MAC-адресом
Я знаю, что это старые вопросы, но это все же первый результат Google, так что вот что я закончил после небольшого исследования:
Предпосылки:
- Коробка Linux в той же сети
- Установите
wakeonlan
пакет от менеджера пакетов вашей системы
(т.е.sudo apt-get install wakeonlan
)
Теперь скрипт такой же простой, как этот:
<?php
# replace with your target MAC address
$mac = 'aa:bb:cc:11:22:33';
exec("wakeonlan $mac");
?>
Надеюсь, что это помогает кому-то.
HTML (test.htm)
<body>
<a href="test.php?mymac=XX:XX:XX:XX:XX:XX">Click to WOL XX:XX:XX:XX:XX:XX</a>
</body>
PHP (test.php)
<?php
$mymac = $_REQUEST['mymac'];
wol("255.255.255.255", $mymac);
echo 'WOL sent to '.$mymac;
function wol($broadcast, $mac){
$mac_array = preg_split('#:#', $mac); //print_r($mac_array);
$hwaddr = '';
foreach($mac_array AS $octet){
$hwaddr .= chr(hexdec($octet));
}
//Magic Packet
$packet = '';
for ($i = 1; $i <= 6; $i++){
$packet .= chr(255);
}
for ($i = 1; $i <= 16; $i++){
$packet .= $hwaddr;
}
//set up socket
$sock = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP);
if ($sock){
$options = socket_set_option($sock, 1, 6, true);
if ($options >=0){
$e = socket_sendto($sock, $packet, strlen($packet), 0, $broadcast, 7);
socket_close($sock);
}
}
} //end function wol
?>
Так как split()
функция была удалена из PHP 7.0.0, этот скрипт использует preg_split()
быть совместимым с текущей и предыдущей версиями PHP.
замещать XX:XX:XX:XX:XX:XX
в HTML с вашей целевой MAC, чтобы проверить скрипт.
Основываясь на предыдущих ответах. Пришлось установить порт udp на 9 и повторить MAC еще пару раз, прежде чем это сработало для меня:
function wol($mac)
{
$hwaddr = pack('H*', preg_replace('/[^0-9a-fA-F]/', '', $mac));
// Create Magic Packet
$packet = sprintf(
'%s%s',
str_repeat(chr(255), 6),
str_repeat($hwaddr, 20)
);
$sock = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP);
if ($sock !== false) {
$options = socket_set_option($sock, SOL_SOCKET, SO_BROADCAST, true);
if ($options !== false) {
socket_sendto($sock, $packet, strlen($packet), 0, "255.255.255.255", 9);
socket_close($sock);
}
}
}
Прочтите, если вы используете PHP в Docker , в противном случае не обращайте на это внимания.
Похоже, что широковещательная рассылка UDP из докера не маршрутизируется должным образом (возможно, транслируется только в самом контейнере, а не на хосте).
Вы можете попробовать установить (CLI)
--network host
или (составить)
network_mode: host
, но для PHP это вызывало проблемы.
Вы не можете отправлять сообщения UDP WoL напрямую, поскольку устройство, которым вы пытаетесь управлять, находится «в автономном режиме», оно не отображается в таблице ARP вашего маршрутизатора, и поэтому прямое сообщение не может быть доставлено.
в итоге я побежал
@reboot root /usr/bin/php -S 0.0.0.0:8877 -t /home/user/php
и положить туда файл vol.php.
В качестве «более подходящего» решения вы можете запустить док-контейнер «wol proxy», который делает именно это (но затем в
network host
привилегированный докер-контейнер).