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привилегированный докер-контейнер).

Другие вопросы по тегам