In questa pagina descriverò come inviare un messaggio
Wake-On-Lan
tramite la rete per eseguire uno script su un router (Asus RT-AC56U)
- useremo alcuni pacchetti di Entware, pertanto
fate riferimento a questa pagina su come installare Entware su un router.
Partiamo dalla premessa che usare un messaggio Wake-On-Lan non è certamente
consigliato poiché chiunque può inviare questo messaggio, basta sapere
l'indirizzo
IP del destinatario,
l'indirizzo MAC del dispositivo di rete da accendere e la porta di
destinazione. Come se non bastasse, il protocollo Wake-On-Lan non prevede una
password. Useremo quindi questa tecnica solo per inviare messaggi non
importanti, ad esempio per eseguire uno script che permette di attivare una
funzionalità secondaria.
Per inviare il messaggio Wake-On-Lan possiamo usare un
qualunque programma che supporta il Wake-On-Lan (fare
riferimento a questa pagina per usare la mia applicazione per il sistema
operativo Android), per ricevere invece il suddetto messaggio Wake-On-Lan sul
router useremo un pacchetto Entware
denominato "socat".
Allo scopo di installare il daemon "socat" con i pacchetti Entware,
dobbiamo eseguire il seguente comando :
opkg install socat coreutils-od
Il pacchetto "socat" contiene soltanto il daemon "/opt/bin/socat", che
andremo in seguito ad analizzare. Mentre il pacchetto "coreutils-od"
contiene il comando "/opt/bin/od" usato dallo script che andremo in seguito ad
analizzare.
Il programma che invia il messaggio Wake-On-Lan dovrà essere impostato usando i seguenti parametri:
Come vedremo in seguito, il daemon "socat" passerà il messaggio Wake-On-Lan ricevuto ad uno script e questo script dovrà essere in grado di interpretare il messaggio Wake-On-Lan ed eseguire determinate azioni. Qui di seguito vediamo un esempio di script, gli diamo il nome "wol_script.sh" (ricordarsi di impostare opportunamente le proprietà di esecuzione del suddetto script usando il comando "chmod +x wol_script.sh" altrimenti il daemon "socat" non potrà eseguirlo):
#!/bin/bash read MESSAGE echo "PID: $$" echo "$MESSAGE" hexvar=$(echo $MESSAGE | /opt/bin/od -t x1) echo $hexvar # execute action 1 if echo $hexvar | grep -q -i "ff ff ff ff ff ff 11 22 33 44 55 66"; then # WOL message is received, we run a command echo "1 String contains hex is true." else echo "1 String contains hex is not true." fi # execute action 2 if echo $hexvar | grep -q -i "ff ff ff ff ff ff 11 77 88 99 AA BB"; then # WOL message is received, we run a command echo "2 String contains hex is true." else echo "2 String contains hex is not true." fi
Come si evince dal suddetto script, eseguiamo le seguenti operazioni:
Le istruzioni "echo" incluse nello script sono usate
solo per questioni di debugging, potranno essere eliminate una volta capito il
procedimento.
Ovviamente potremo inserire più istruzioni "if" con
diversi indirizzi MAC, ricordandoci di usare un carattere spazio tra un numero
esadecimale e il successivo. All'atto pratico, nel programma che deve inviare il
messaggio Wake-On-Lan, potremo aggiungere più voci Wake-On-Lan, ma l'unica cosa
che cambierà sarà il valore dell'indirizzo MAC fittizio, i valori dell'indirizzo
IP del router e della porta rimarranno sempre gli stessi.
Una volta impostato il programma che deve inviare il
messaggio Wake-On-Lan ed una volta impostato lo script che dovrà ricevere il
messaggio Wake-On-Lan, andiamo ad eseguire il daemon "socat". Una tipica
istruzione che possiamo eseguire è la seguente:
/opt/bin/socat -u -T1 UDP-LISTEN:25000,fork system:/opt/etc/wol_script.sh
Nella suddetta istruzione abbiamo i seguenti parametri (per maggiori
informazioni sul daemon "socat" fare riferimento
a questa pagina
su Internet):
La suddetta istruzione, se eseguita nel terminale del router,
verrà eseguita in modalità di debugging come utente "root". Per questioni
di sicurezza, consiglio di eseguire il daemon "socat" tramite l'utente "nobody"
(ovviamente anche lo script verrà eseguito come utente "nobody", e così
anche tutti i comandi eseguiti all'interno dello script).
Per fare questo, bisogna usare il comando "daemonize", comando che si può
installare tramite un pacchetto Entware con l'istruzione "opkg install daemonize".
Il daemon "socat" potrà essere quindi eseguito con la seguente istruzione:
daemonize -u nobody /opt/bin/socat -u -T1 UDP-LISTEN:25000,fork system:/opt/etc/wol_script.sh