【问题标题】:Bash one-line command to send wake on LAN magic packet without specific toolbash 单行命令无需特定工具即可在 LAN 魔术包上发送唤醒
【发布时间】:2018-11-08 16:10:22
【问题描述】:

是否可以伪造 wake on LAN 魔术包 并仅通过 单行 bash 命令发送它?

当然,我知道有专门的工具可以一次性解决问题,但了解 WOL 锻造的最低要求可能会很有用。这就是:如何处理 LAN 唤醒无需特定工具

【问题讨论】:

    标签: bash wake-on-lan


    【解决方案1】:

    最低要求我可以考虑:

    • Bash 支持大括号扩展(我认为是 v3.5.1 及以上版本)。
    • sed 命令 (1)。
    • NetCat

    假设:

    • 用于 LAN 的 WOL 包,广播到 255.255.255.255。

    命令行将是:

    echo -e $(echo $(printf 'f%.0s' {1..12}; printf "$(echo $MAC | sed 's/://g')%.0s" {1..16}) | sed -e 's/../\\x&/g') | nc -w1 -u -b 255.255.255.255 4000
    

    用目标 MAC 替换 $MAC。或者,这次是在一个两行 :-) 命令中:

    MAC=11:22:33:44:55:66
    echo -e $(echo $(printf 'f%.0s' {1..12}; printf "$(echo $MAC | sed 's/://g')%.0s" {1..16}) | sed -e 's/../\\x&/g') | nc -w1 -u -b 255.255.255.255 4000
    

    所以,用更通用的表示法:

    MAC=11:22:33:44:55:66
    Broadcast=255.255.255.255
    PortNumber=4000
    echo -e $(echo $(printf 'f%.0s' {1..12}; printf "$(echo $MAC | sed 's/://g')%.0s" {1..16}) | sed -e 's/../\\x&/g') | nc -w1 -u -b $Broadcast $PortNumber
    

    解释:

    • WOL ma​​gic 数据包由ffffffffffff(12 倍f)后跟16 倍不带冒号的目标MAC (:) 组成。
    • sed 命令在此处用于删除冒号 (:) 从 MAC 并添加 \x 十六进制说明符(以便 @987654333在将字符串发送到网络堆栈之前,@ 变为 \x1122 变为 \x22 ... 等等。
    • 伪造的 LAN 唤醒包被发送到网络堆栈通过管道传送到 NetCat。可以改用SoCat(当然,语法会有所不同)。

    在 Ubuntu、Kali 甚至 CygWin(Windows 7 SP 1 64 位)上测试工作

    考虑:

    • CygWin 的 NetCat 版本不需要-b 参数。
    • NetCat 的 OpenBSD 版本在今天(2015 年 7 月)在广播数据发送 (-b) 上有一个错误,因此您必须将其替换为 NetCat 传统版本(netcat-traditional package on apt-get 安装程序)。
    • 此示例使用 UDP 端口 4.000。 特定端口号在 WOL 上似乎并不重要。
    • 上面的单行 bash 命令也适用于通过互联网在 LAN 上唤醒。在这种情况下,将 $Broadcast 地址替换为目标公共 IP,并在目标上打开/转发指定的 $PortNumber (UDP)。
    • echo -e 可以替换为 printf

    上例的 WOL 魔术包字符串:

    FFFFFFFFFFFF112233445566112233445566112233445566112233445566112233445566112233445566112233445566112233445566112233445566112233445566112233445566112233445566112233445566112233445566112233445566112233445566
    

    (1) 确实,sed 不是明确要求的。此处用于删除 ':' 并将\x 添加到魔术包的伪造字符串中的每对字符。我知道有一些方法可以通过一些 shell 扩展来替换 sed

    【讨论】:

    • 可以用bash/dev/udp代替netcat吗?
    • 我认为不是,但这里正在讨论:unix.stackexchange.com/questions/217476/…。简而言之:你可以做到,但有一些不稳定因素。即:发送\x0a 充当网络包的某种datagram break 标志,因此您不能为0a:11:22:33:44:55 等MAC 发送(或者我不知道如何)WOL。
    • 我认为值得一提的是,在某些发行版(例如 Ubuntu 16.04)中,您需要使用 netcat-traditional 包(Unix)来运行此命令,而不是 ǹetcat-openbsd 包,后者有不同的方式来传递参数。如果您的系统使用 openbsd 风格(如在 Ubuntu 16.04 上),请将其卸载,然后安装传统风格。要检查您的口味,请运行man nc。如果最上面一行是“BSD 通用命令手册”,那就是 BSD 风格。
    • @ColinMaudry - 安装错误 netcat 版本时的实际错误消息是:nc: protocol not supported
    • nc (ubuntu 14.04) 上遇到了与-b 相同的问题,但将nc 调用替换为socat 调用:socat - UDP-DATAGRAM:${Broadcast}:${PortNumber},broadcast
    【解决方案2】:

    唤醒传输的默认端口是 UDP 端口 9。

    UDP 是推荐用于 WOL 的协议,因为它可以在没有带有安全限制的原始套接字的情况下生成,并且推荐使用端口 9,因为它映射到旧的众所周知的丢弃协议。有时您会看到端口 7 被使用,但这映射到 echo 协议。

    这意味着,如果您的网络上存在支持这种旧的简单标准服务的主机,则在使用端口 7 时您将获得不必要的反向散射流量,但在使用端口 9 时则没有。而且由于 LAN 唤醒通常是广播的,您可以从许多主机获得反向散射。

    此外,如果您使用网络嗅探器(如 Wireshark)对 WoL 进行故障排除,则只有当 WoL 数据包是端口 9 上的 UDP 数据包时,它才会正确解码。

    来源:https://superuser.com/questions/295325/does-it-matter-what-udp-port-a-wol-signal-is-sent-to

    【讨论】:

    • 点评来源: 嗨,虽然链接是分享知识的好方法,但如果它们将来被破坏,它们将不会真正回答问题。将回答问题的链接的基本内容添加到您的答案中。如果内容太复杂或太大而无法在此处放置,请描述所提出解决方案的总体思路。请记住始终保留指向原始解决方案网站的链接引用。见:How do I write a good answer?
    • 欢迎来到 StackOverflow。即使您有关 WOL 协议的信息可能有用,这也不是写下来的正确方法,因为它实际上并没有回答原始问题。最好删除您的答案,只要它没有真正提供在没有特定 WOL 工具的情况下伪造 WOL 数据包的方法。如果没有,您可能会被否决。
    • 这是对您答案的改进。您写道,使用哪个 UDP 端口无关紧要,但惯例是使用端口 9 进行 WOL
    猜你喜欢
    • 2022-07-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-01
    • 1970-01-01
    相关资源
    最近更新 更多