使用 BusyBox 进行 LAN 唤醒?

使用 BusyBox 进行 LAN 唤醒?

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

wakeonlan 11:22:33:44:55:66

答案1

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

BusyBox 中的命令ether-wake正是您所需要的。如果您的 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

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

syslogd -n -O /dev/null -l 0 -R 192.0.2.255/7 &
syslogd_pid=$!
logger "$wol_packet"
kill $!

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

echo "$wol_packet" | tr B '\000' | nc -u 7 192.0.2.255

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

echo "$wol_packet" >/dev/udp/192.0.2.255/7

答案2

/dev/udp被 bash 识别并且实际上并不存在于文件系统中,所以尝试一下。

syslogd我认为不用开关也可以使用-l,只要它支持-R.

我有 busybox 与syslogdwithoutouunt -R, no nc​​nonor bash,但我仍然卡住了。

答案3

我有一个在旧 HTC dream 上运行的 ssh 服务器。我的busybox版本也不包含ether-wake,而且我的技术不够熟练,无法编译自己的busybox。幸运的是,我设法使用以下命令唤醒我的电脑:

bash
cat mac2.txt | tr B '\000' >/dev/udp/192.0.1.255/7

请注意,我的网络中的广播 ip 是不同的。

我在我的电脑上制作了包含魔术包的文件(mac2.txt),并通过 SFTP 将其推送到服务器。因为我的 mac 有空字节,所以我必须使用 tr 将所有 x42 字节替换为 00。它的工作方式就像魅力一样。

相关内容