Posledni dobou jsem si zvykl pouzivat vzdalenou plochu na domacim PC. Kdyz jsem mimo domov, mam jen pomaly netbook, se kterym se pripojuju na vykonny domaci pocitac. Pouzivam asi nejlepsi NoMachine NX (o tom nekdy priste). Problem je zapnuti pocitace. Trvale zapnuty ho nechat nechci, elektrina je draha. Proto pouzivam Wake on LAN. WoL je nutne posilat ze zarizeni na stejne siti, idelane z routeru. Driv jsem se prihlasoval na router pres SSH, ale to neni pohodlne. Proto jsem si napsal webove klikatko. V OpenWrt routeru mam jen 4MB flash, proto neslo puzivat PHP. Zvolil jsem shell. Bash se take nevesl, takze busybox.
Cisty POSIX shell (busybox) ma hodne omezeni, napr. neumi pole, ma jinou syntaxi podminek a mohl bych pokracovat. Vzdy je lepsi pouzit bash, jenze ten se mi nevesel.
Zde jsou dva skripty. Prvni obsahuje formular:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
#!/bin/sh echo "Content-type: text/html" echo "" cat << EOF <!DOCTYPE html> <html> <head> <title>Wake On Lan</title> <meta name="robots" content="noarchive"> <meta name="robots" content="noindex, nofollow"> <meta name="viewport" content="width=device-width,initial-scale=1"> <style> .text { font-size: 200%; margin-bottom: 1em; display: block; } </style> </head> <body> <form action="wake.sh" method="GET"> <input type="text" class="text" name="password" placeholder="Password..." size="10" /> <input type="submit" class="text" name="computer" value="PC" /> <input type="submit" class="text" name="computer" value="X" /> </form> </body> </html> EOF |
vygeneruje GET pozadavek ve tvaru „http://example.net/cgi-bin/wake.sh?password=tajneHeslo&computer=PC„. Druhy ho zpracovava:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 |
#!/bin/sh PASS="test123" IFACE="br0" # FORM GET: IFS="&" for QUERY_PARTS in $QUERY_STRING; do QKEY="`echo $QUERY_PARTS | cut -d '=' -f 1`" QVAL="`echo $QUERY_PARTS | cut -d '=' -f 2`" eval "$QKEY=\"$QVAL\"" done echo "Content-type: text/html" echo "" cat << EOF <html><head><title>Wake On Lan</title></head> <body> <h1>Wake On Lan</h1> <p style="font-size: 140%"> EOF if [ "$password" = "$PASS" ] ; then case "$computer" in "PC") MAC="00:1f:d0:90:f5:00" ;; "X") MAC="00:11:22:33:44:55" ;; *) MAC="" echo "PC neexistuje!" echo "</p></body></html>" exit 1 ;; esac #echo "sudo etherwake -i $IFACE $MAC" >> /tmp/cgi-bin sudo etherwake -i <span style="font-size: 11.362px; line-height: 20.672px; font-family: Verdana, sans-serif;">$IFACE $MAC</span> echo "Wake On LAN odeslan" else echo "Spatne heslo!" fi echo "</p></body></html>" |
Skripty je potreba umisti do adresare, ve kterem web server hleda cgi-bin skripty. Apache na Ubuntu pouziva adresar /usr/lib/cgi-bin . U Apache je nutne jeste zapnout CGI.
Na novych OpenWrt je to adresar /www/cgi-bin . Skriptum je potreba nastavit pravo spusteni (chmod a+x jmenoSkriptu).
Pote prejdeme na adresu http://example.net/cgi-bin/wol a uvidime formular.
Pro pridani dalsiho pocitace pridame prislusny input v prvnim skriptu, dulezita je hodnota value a case cast v ruhem skriptu.
Samotne parsovani provadi druhy skript. V nem je potreba nastavit heslo a sitovku pripojenou k pocitacum. WoL se nesiri pres routery!
Skript dale overi heslo a pokud souhlasi, najde podle vstupu pocitac. Kdyz existuje, zavola program etherwake a odesle WoL. Na OpenWrt je potreba odebrat prikaz sudo.
Na Ubuntu je potreba povolit uzivateli, pod kterym bezi webserver spoustet etherwake. Ten muze normalne spoustet pouze root. Udelame to nasledovane:
prikazem visudo otevreme ediaci sudo a pridame radek:
1 |
www-data ALL=NOPASSWD: /usr/sbin/etherwake |
uziavatel www-data bude moct spustit pouze progam etherwake s pomoci suda jako root a nebude vyzadovano heslo.
Z duvodu bezpecnosti je kriticky druhy skript zpracovajici uzivateluv vstup. Uzivatel muze http getem predet nazev pc treba „; rm -rf /“ a mame smazany disk. Pri realnem pouziti je potreba vstup osetrit, nebo pokud je dost mista, pouzit misto shellu treba PHP.
Ja pouzivam skript sam, takze bezpecnost resit nemusim.
Pouzite zdroje:
L.