12

是否有使用网络语言(最好是 php)的局域网唤醒脚本?还有一个有一些关于如何让它工作的文档,比如需要在服务器上启用什么等

4

5 回答 5

13
function wol($broadcast, $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, 16)
    );

    $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, $broadcast, 7);
            socket_close($sock);
        }
    }
}

应该可以 - 使用广播 IP 地址和 MAC 地址调用它

于 2011-05-19T08:20:15.117 回答
8

我知道这是一个老问题,但它仍然是谷歌的第一个结果,所以这是我经过一番研究后最终做的:

先决条件:

  • 同一网络上的 Linux 机器
  • wakeonlan从系统的包管理器安装包
        (即sudo apt-get install wakeonlan

现在脚本就像这样简单:

<?php
    # replace with your target MAC address
    $mac = 'aa:bb:cc:11:22:33';

    exec("wakeonlan $mac");
?>

 

希望对某人有所帮助。

于 2013-11-19T07:06:55.790 回答
2

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 版本兼容。

用您的目标 MAC替换XX:XX:XX:XX:XX:XXHTML 以测试脚本。

于 2018-05-20T15:31:27.300 回答
0

基于之前的答案。必须将 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);
        }
    }
}
于 2020-06-26T09:26:41.903 回答
-1

如果您在Docker中运行 PHP,请阅读,否则请忽略这一点。

似乎来自 docker 的 UDP 广播没有被正确路由(可能只在容器本身中广播,而不是在主机上)。

您可以尝试设置 (CLI)--network host或 (compose) network_mode: host,但对于 PHP,这会导致问题。

您无法直接发送 UDP WoL 消息,因为您尝试控制的设备处于“离线”状态,它不会显示在路由器的 ARP 表中,因此无法传递直接消息。

我最终运行@reboot root /usr/bin/php -S 0.0.0.0:8877 -t /home/user/php并将 wol.php 文件放在那里。

作为一个“更合适”的解决方案,您可以运行一个“wol 代理”docker 容器来执行此操作(但随后在network host特权 docker 容器中)。

于 2021-04-09T09:06:14.470 回答