使用 BusyBox 进行局域网唤醒?

mic*_*con 8 wake-on-lan busybox

是否可以在 bash 中实现唤醒网络魔术包?我使用的是旧的、定制的 BusyBox 并且没有ether-wake. 是否可以用其他一些 shell 命令替换它,例如:

wakeonlan 11:22:33:44:55:66
Run Code Online (Sandbox Code Playgroud)

Gil*_*il' 7

您需要能够发送以太网数据包的东西,该数据包将被您想要唤醒的设备看到。

ether-wakeBusyBox 中的命令正是您所追求的。如果您的 BusyBox 没有它,请考虑重新编译 BusyBox 以包含它。

如果你有一个足够“臃肿”的 netcat(BusyBox 可以有两种nc实现中的一种,其中一种只处理 TCP),你可以将手工制作的 UDP 数据包发送到设备连接到的网段的广播地址。

mac=$(printf '\xed\xcb\xa9\x87\x65\x43') # MAC = ed:cb:a9:87:65:43
wol_packet=$(printf "\xff\xff\xff\xff\xff\xff$mac$mac$mac$mac$mac$mac$mac$mac$mac$mac$mac$mac$mac$mac$mac$mac")
echo "$wol_packet" | nc -u 7 192.0.2.255
Run Code Online (Sandbox Code Playgroud)

您可以滥用来发送该数据包的另一个 BusyBox 实用程序是syslogd.

syslogd -n -O /dev/null -l 0 -R 192.0.2.255/7 &
syslogd_pid=$!
logger "$wol_packet"
kill $!
Run Code Online (Sandbox Code Playgroud)

如果 MAC 包含空字节,您将无法如此轻松地制作数据包。选择一个\xff不在 MAC 中的字节,例如\x42( B),然后通过tr.

echo "$wol_packet" | tr B '\000' | nc -u 7 192.0.2.255
Run Code Online (Sandbox Code Playgroud)

如果你真的有 bash(这在带有 BusyBox 的设备上是非常不寻常的——你确定你真的有 bash,而不是 BusyBox 提供的另一个 shell?),它可以通过重定向到/dev/udp/$hostname/$port.

echo "$wol_packet" >/dev/udp/192.0.2.255/7
Run Code Online (Sandbox Code Playgroud)