Hai bisogno di qualcosa che sia in grado di inviare un pacchetto Ethernet che verrà visto dal dispositivo che desideri svegliare.
Il ether-wake
comando in BusyBox è esattamente quello che stai cercando. Se il tuo BusyBox non ce l'ha, considera di ricompilare BusyBox per includerlo.
Se si dispone di un netcat sufficientemente "bloaty" (BusyBox può avere una delle due nc
implementazioni, una delle quali gestisce solo TCP), è possibile inviare un pacchetto UDP creato manualmente all'indirizzo di trasmissione del segmento di rete a cui è connesso il dispositivo.
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
Un'altra utility BusyBox che potresti abusare dell'invio di quel pacchetto è syslogd
.
syslogd -n -O /dev/null -l 0 -R 192.0.2.255/7 &
syslogd_pid=$!
logger "$wol_packet"
kill $!
Se il MAC contiene un byte null, non sarà possibile creare il pacchetto così facilmente. Scegli un byte che non lo è \xff
e non è presente nel MAC, ad esempio \x42
( B
), e passa attraverso tr
.
echo "$wol_packet" | tr B '\000' | nc -u 7 192.0.2.255
Se hai davvero bash (che è estremamente insolito sui dispositivi con BusyBox - sei sicuro di avere davvero bash e non un'altra shell fornita da BusyBox?), Può inviare pacchetti UDP reindirizzando a /dev/udp/$hostname/$port
.
echo "$wol_packet" >/dev/udp/192.0.2.255/7