4
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

ブラウザ経由でシェルスクリプト叩いてWake on LANする

Last updated at Posted at 2020-02-13

WiFiルーターを買い替えたら、発売日的に6年後のモデルなのに、以前の機種にあった"PCリモート起動"(ルーターのWebツールでWoLのマジックパケットを飛ばせる機能)が消え失せました。(WR8750N→WG1200HS3)

ブラウザでWoL飛ばせるのがすごい便利だったのですが、無くなったものは仕方ない。自分でどうにかせねばということで、可能な限り手間を掛けずに今までと同じような機能を作ってみます。

必要なもの

  • 家のLANとインターネットに繋がっているRaspberry Pi的なやつ(お好きなものをどうぞ)

どんな感じにするかを考える

"PCリモート起動"とはどういう画面だったかを思い出す

こんな感じでした(実機をしまってしまったので、 https://michisugara.jp/archives/2015/home_ip.html からお借りしました。)
image.png
題名と端末選択と起動ボタンですね。
自宅LANで使うだけの無くなった機能を復活させたいだけなので、プルダウンメニューは再現せずに行きます。

方針

  • ラズパイ側はこれだけのためにphpとかPerlとか入れるの面倒なので、シェルスクリプトをCGIとして起動してマジックパケットを飛ばす
  • JavaScriptは使わない
  • HTML5なんて知らん

やることを3行でいうと・・・

  • Apache入れてCGIとしてシェルスクリプト実行できるようにする
  • HTML書く
  • シェルスクリプト書く

1. Raspberry Piにapacheとetherwake(WoL飛ばせるソフト)を入れる

$ sudo apt install apache2 etherwake

2. Apacheの設定

apacheに.shファイルもCGIとして動かしてねってお願いします。

/etc/apache2/sites-available/wol.conf
ScriptAlias /cgi-bin/ "/var/www/cgi-bin/"
<Directory "/var/www/cgi-bin">
        AllowOverride None
        Require all granted
        Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
        Order allow,deny
        Allow from all
</Directory>

AddHandler cgi-script .sh

保存したら今書いた設定を有効化します

$ sudo a2ensite wol.conf
$ sudo service apache2 reload

apacheがcgiを実行できるようにします

$ sudo a2enmod cgid

apacheを再起動します

$ sudo service apache2 restart

3. HTMLを書く

こんなのを書きました。最低限ですね。
/var/www/cgi-bin/に、wol.shというファイルを作成する前提です。

/var/www/html/index.html
<html>
    <head>
        <meta charset="utf-8"/>
        <title>Wake On Lan</title>
    </head>
    <body>
        <h1>Wake On Lan</h1>
        <button onclick="location.href='http://192.168.0.100/cgi-bin/wol.sh'">母艦機を起動</button>
        <!-- 二台以上ある場合は、指定するシェルスクリプトの名前を適宜個別に変更して必要数作って羅列しましょう。-->
    </body>
</html>

こんな感じになります
image.png

4. シェルスクリプトを書く

/var/www/cgi-binに、wol.shという名前で書きました。

/var/www/cgi-bin/wol.sh
#!/bin/sh -xv

echo "Content-Type: text/html; charset=UTF-8"

wakeonlan 0a:1b:2c:3d:4e:5f > /dev/null

echo ""
echo マジックパケットを飛ばしました

-xvというオプションは、実行した文をそのまま出力するオプションらしいです。apacheのログに残りました。なくてもいいかな?

echo "Content-Type: text/html; charset=UTF-8"は、これがないと結果の画面が出せないため、HTMLヘッダをechoで吐き出してもらいます。

wakeonlan 0a:1b:2c:3d:4e:5f > /dev/nullは、WoLのマジックパケットを飛ばしてくれる部分です。MACアドレスは適宜変更してくださいね。 ただ、どうもIPアドレス指定がなかったりすると、CGIとして実行時にエラーを吐き、Internal Server Errorが出ちゃうので、エラーメッセージを/dev/nullに投げてもみ消します。(動けばいいんです。)

最後はブラウザに文字を表示するための部分です。表示さえしてもらえればいいので特にタグとかつけませんでした。

次にシェルスクリプトを実行できるようにします。

$ sudo chmod +x wol.sh

5. 試す

image.png

これで対象のマシンが起動してきたら成功です。

元の機能よりだいぶ簡略化されましたけど、これで目的が果たされたので満足です。
ただ元のやつと違って、w3mでボタンが押せなくなったのでHTMLの編集が必要そうです・・・(inputタグでやればいいのか?)

Apache経由でシェルスクリプトの実行という部分を応用すれば、色々といろんなことが出来そうな気がします。

参考にしたサイト

CGI用のシェルスクリプトの書き方
「UEC - usp engineers' community - UECジャーナル」
https://uec.usp-lab.com/JOURNAL/CGI/JOURNAL.CGI?POMPA=KAIGAN_journal19

etherwakeについて
「Raspberry Piで自宅内のWindows機を起動させる (Wake-on-LAN) - たねやつの木」
https://www.taneyats.com/entry/raspi-wake-on-lan#Raspberry-Pi%E3%81%AE%E8%A8%AD%E5%AE%9A

confファイルの書き方
「ubuntu16.04のApache2設定/cgi設定 - Qiita」
https://qiita.com/kummn/items/f6bd0f3e643595ed077a

4
7
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?