【问题标题】:Wake on lan script that works唤醒有效的局域网脚本
【发布时间】:2011-05-19 07:34:46
【问题描述】:

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

【问题讨论】:

  • 究竟什么是“局域网唤醒脚本”?
  • 关于服务器配置:提防操作系统级别的 WoL 阻塞(Linux 关闭局域网唤醒) - 基本上 ethtool -s eth0 wol g 将成为你的朋友:ubuntuforums.org/showthread.php?t=234588 - 关于“服务器配置”的内容非常多

标签: php wake-on-lan


【解决方案1】:
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 地址调用它

【讨论】:

  • 当你说用这两个东西调用它时,你的意思是将它们设置为变量吗?
  • 我的意思是 - 将它们作为参数传递给函数
  • 抱歉已经不行了。警告:socket_send() 需要 4 个参数,给定 6 个
【解决方案2】:

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

先决条件:

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

现在脚本就这么简单了:

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

    exec("wakeonlan $mac");
?>

 

希望对某人有所帮助。

【讨论】:

  • 只要 $mac 从不包含用户输入,它就可以工作。谢谢!
  • 是的。使用 exec 时要非常小心,如果可能,请不要使用它
  • 鉴于这个问题假设了一个简单的现成解决方案,我相信“同一网络上的 linux 盒子”的先决条件(尤其是你必须触发 exec 命令的那个)似乎并不适合这里。
  • @Artanis exec() 如果您控制整个命令,则完全没问题。当然,这个解决方案只适用于拥有现有服务器的人,但最好是共享信息而不是隐藏它,因为它可能不适用于特定的人。
【解决方案3】:

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

将 HTML 中的 XX:XX:XX:XX:XX:XX 替换为您的目标 MAC 以测试脚本。

【讨论】:

  • 我认为这根本不是一个好主意。我可以想象一家公司淘汰一些旧的应用程序服务器并将它们搁置,然后忘记它们。随之而来的是蜘蛛和砰!我开始在一夜之间为每个流行的服务器 NIC 广播 WOL,而你第二天早上来发现大量的 IP 冲突和垃圾数据库连接......更不用说由突然出现在网络上的一堆旧的、未打补丁的服务器引入的安全漏洞网络。
  • 是的,这是一个很好的安全提示。您不希望在公共网页上显示此内容。这是您在家庭专用网络上使用的一种工具,可通过简单的专用网页启动您的电脑。
【解决方案4】:

基于之前的答案。必须将 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);
        }
    }
}

【讨论】:

  • 也可以将端口/重复设为可选。然而;我没有运气让这些例子中的任何一个起作用。出于某种原因,在使用“自制软件”的“wakeonlan”时,我会看到数据包出现在数据包发送器中(设置为在端口 9 上接收 UDP),但在使用上述脚本时却没有。我猜这可能是由于 PHP 在 docker 中运行。
【解决方案5】:

如果您在 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 容器中)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多