先のエントリーでWOL(Wake On Lan)に成功したことを記したが、それをより効果的に利用出来るように考えて成功したので備忘録しておく。
要するに常時起動のVine Linuxマシンから、TVサーバのマシンの電源ONの制御をしようって考えだ。それをWebブラウザを使ってやりたいと言う話。
もちろんこの方法なら、ルーター越しのWOLも可能だということだ。職場などの出先のPCからはもちろん、最近の携帯電話ならブラウザが付いているのでそれも可能だと思う。技術的には大した事無いが一つの方法として参考になれば幸いである。
問題は私がPerlを全く理解していない事である。よってCGIもシェルスクリプトで書かざるを得ない。でも本当にそれって可能なのだか?調べてみたら同じことをやっている方のブログで「ルーターの外からwol」を発見したので、シェルスクリプトでCGIを書くのも可能なんだなと裏づけが取れたので実践することにした。
しかし、シェルスクリプトでCGIを書くのって本当は良くない方法らしいから、せめてベーシック認証をかけたディレクトリに設置することにした。ついでにhtmlファイルを置いてちょっとだけ見栄えもよくしてみる。実行ボタンをクリックするだけなんだが。
注意:下記にURLが出てきますが架空のものです。ハックしようとかしないでね。そもそも存在しないURLを例にしていますから、認証を破ってやろうなんて事は無駄です。
まず、wolコマンドを実行するシェルスクリプトを書いてしまおう。
難しいのは嫌なので極めてシンプルに書いてしまう。
$ which sh
/bin/sh
$ cd
$ vi wol.sh
wol.sh という名前で保存するとする
———————————————–
#!/bin/sh
wol 192.168.1.255 xx:xx:xx:xx:xx:xx
———————————————–
本当にwolが動くか確認しておこう
$ chmod 705 wol.sh
$ ./wol.sh
リモートで起動することに成功したら次のステップに進もう
既に公開しているWebサーバにスクリプトと、簡単なhtmlのページを作る。
ちなみに私はpublic_htmlディレクトリをベーシック認証して設置することにした。
(ベーシック認証についてはどこかに記した記憶があるので、ここでは書きません)
$ cd public_html/
$ vi wol.cgi
wol.cgi という名前で保存する(Perlではなくshで書いてる)
————————————————-
#!/bin/sh
echo Content-type: text/html
echo
echo "<title>sending wol</title>"
echo "<p>"
echo "sending wol to fluorite"
echo "…"
sh /home/wol/wol.sh
echo "…"
echo "</p>"
echo "<p>"
echo "done."
echo "</p>"
————————————————-
$ chmod 705 wol.cgi
Webブラウザ用にHTMLのページを作っておくとちょと自己満足に浸れそう(w
$ vi wol.html
wol.html という名前で保存する
————————————————-
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=Shift_JIS">
<title>WOL-SH</title>
</head>
<BODY BGCOLOR="#ffe0c0">
<H3 align="center">WOL-SH</H3>
<HR>
<p align="center">テレビサーバの電源をWake on LANで入れるっちゃ</p>
<form action="./wol.cgi" method="post" name="wol" id="wol">
<div align="center">
<input type="submit" name="Submit" value="送信">
</div>
</form>
<HR>
</body>
</html>
————————————————-
これで出来たのでWebブラウザからアクセスしてみた
ベーシック認証がかかっていて、ユーザー名とパスワードを入力した
極めてシンプルなページとボタンが一個出てきたので、ボタンをクリックする。
Internal Server Error …….
なんじゃそりゃ~
httpdのエラーログ確認
Resource temporarily unavailable:
couldn't spawn child process: /home/wol/public_html/wol.cgi
チャイルドプロセスが作れないとかぬかしてるな..
そもそもシェルで書いたCGIは機能するんか?
$ ./wol.cgi
あらら、ちゃんとWOLでリモート起動がかかってメッセージも出てきた
Content-type: text/html
<title>sending wol</title>
<p>
sending wol to fluorite
…
…
</p>
<p>
done.
</p>
って事は、シェルスクリプト(sh)でCGIを書いているから、Apacheが拒否してるって感じだろうな。
そういえば、ExecCGIとかのところに、CGIファイルの拡張子を定義するところ(AddHandler)があったはず。
$ su –
# less /etc/httpd/conf/httpd.conf
/AddHandler
みぃつけた(w
けど待てよ..ここを書き換えちゃうと、Apache全体に適用されちゃうよな。それはまずいな。
ってことで、.htaccessを利用することに決定。既にベーシック認証の為に設置してるから追記するだけでいけるはず。
# exit
$ cd ~/public_html
$ vi .htaccess
AddHandler cgi-script .cgi.sh
気を取り直して、もう一度テストをやってみた
ボタンをクリック!
カチン、ピコッという音と共に電源ファンの音が鳴って、LEDが点灯した!
やったぜ成功!!やるじゃん俺(w
という訳でWebブラウザでWOLに成功したのでありました。
実は、メールを送ってそれをトリガーにしてシェルを実行させるって方法も考えたんだけどね。それはまたの機会にしようかな。とりあえず上手く出来てよかった。
冗長しますが、上記のURLは架空のもので存在しません。わざわざ秘密の入り口をネットで公開するほど間抜けではないっす(w


コメント