Você precisa de algo que seja capaz de enviar um pacote Ethernet que será visto pelo dispositivo que você deseja ativar.
O comando ether-wake
no BusyBox é exatamente o que você está procurando. Se o seu BusyBox não o tiver, considere recompilar o BusyBox para incluí-lo.
Se você tiver um netcat suficientemente "inchado" (BusyBox pode ter uma das duas implementações nc
, uma das quais lida somente com TCP), você pode enviar um pacote UDP criado manualmente para o endereço de broadcast do segmento de rede que o dispositivo está conectado a.
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
Outro utilitário BusyBox que você poderia abusar para enviar esse pacote é syslogd
.
syslogd -n -O /dev/null -l 0 -R 192.0.2.255/7 &
syslogd_pid=$!
logger "$wol_packet"
kill $!
Se o MAC contiver um byte nulo, você não poderá criar o pacote tão facilmente. Escolha um byte que não seja \xff
e que não esteja no MAC, digamos \x42
( B
), e passe por tr
.
echo "$wol_packet" | tr B 'echo "$wol_packet" >/dev/udp/192.0.2.255/7
0' | nc -u 7 192.0.2.255
Se você realmente tem bash (o que é extremamente incomum em dispositivos com BusyBox - você tem certeza que realmente tem bash, e não outro shell fornecido pelo BusyBox?), ele pode enviar pacotes UDP redirecionando para /dev/udp/$hostname/$port
.
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