8

Is it possible to implement the wake-on-lan magic packet in bash? I'm using a old, customized BusyBox and don't have ether-wake. Is it possible to replace it with some other shell command, like:

wakeonlan 11:22:33:44:55:66
Gilles 'SO- stop being evil'
  • 807,993
  • 194
  • 1,674
  • 2,175
michelemarcon
  • 3,357
  • 10
  • 32
  • 37

3 Answers3

7

You need something that's capable of sending an Ethernet packet that will be seen by the device you want to wake up.

The ether-wake command in BusyBox is exactly what you're after. If your BusyBox doesn't have it, consider recompiling BusyBox to include it.

If you have a sufficiently “bloaty” netcat (BusyBox can have one of two nc implementations, one of which handles TCP only), you can send a manually crafted UDP packet to the broadcast address of the network segment that the device is connected to.

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

Another BusyBox utility that you could abuse into sending that packet is syslogd.

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

If the MAC contains a null byte, you won't be able to craft the packet so easily. Pick a byte that's not \xff and that's not in the MAC, say \x42 (B), and pipe through tr.

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

If you really have bash (which is extremely unusual on devices with BusyBox — are you sure you really have bash, and not another shell provided by BusyBox?), it can send UDP packets by redirecting to /dev/udp/$hostname/$port.

echo "$wol_packet" >/dev/udp/192.0.2.255/7
Gilles 'SO- stop being evil'
  • 807,993
  • 194
  • 1,674
  • 2,175
1

/dev/udp is recognized by bash and doesn't really exist in the filesystem, so give it a try.

I think you can use syslogd without -l switch, as long as it supports -R.

I have busybox with syslogd withount -R, no nc nor bash and I'm still stuck.

mtk
  • 26,802
  • 35
  • 91
  • 130
bergonz
  • 11
  • 1
0

I have an ssh server running on old HTC dream. My version of busybox also didn't include ether-wake and I'm not skilled enough to compile my own busybox. Fortunately I managed to wake up my PC using:

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

Notice that the broadcast ip is different in my network.

I crafted the file (mac2.txt) containing the magic packet on my PC and pushed it to the server via SFTP. Because my mac has null byte I have to use tr to substitute all x42 bytes with 00. It worked like charm.

rahmu
  • 19,673
  • 28
  • 87
  • 128
zibo
  • 1