2019-03-19マシンを遠隔起動出来るWake-on-LAN(WoL)はとても便利です。通常はWoL専用のツールを用いますが、そういうものをインストール出来ない、したくないといった状況でも、結構簡単にbashだけで自作することができます。$PORTWoLの解説まずWoLの仕組みを解説します。WoLでマシンを起動するには、「マジックパケット」を同じネットワークにあるマシンからブロードキャスト1します。マジックパケットについてはWikipediaの説明がわかりやすいので引用します。ペイロードのどこかに含まれているようなパケットである。(UTC)の版)『ウィキペディア日本語版』。このデータをUDPで2ブロードキャスト1すれば、該当マシンが起動してくれます。ポート番号は何番でも良いです(パケットの中身しか見ていないので)が、慣例として9番が指定されることが多いです。#シェルスクリプトの解説WoLの仕組みを踏まえて、上記シェルスクリプトの中身を解説します。最初に定義されている変数については以下の通りです。起動したいマシンのMACアドレスを:区切りで指定します。ここはスクリプト内変数じゃなくてコマンドライン引数で実装するのも良い考えだと思います。WoLの送信先のブロードキャストアドレス。通常は255.255.255.255を指定しておけば良いですが、送信先ネットワークを指定したい場合などは変更して下さい。一応変数にしていますが、何番でも良いです。6for文に渡すことで、6回コマンドを繰り返すことが出来ます。echoコマンドの-nオプションは改行を出力しないとうオプションです。-eオプションはバックスラッシュによるエスケープを有効にします。WoLはバイナリデータなので必要です。${MAC//:/\\x}はMACという変数の:を\xに置換した文字列を表します。'\x'${MAC//:/\\x}\x01\x23\x45\x67\x89\xABそれを-enオプションを付けることで、バイナリで出力することになります。ncコマンドの-bオプションは、必要な環境と不要な環境があります。cygwinはその一つです。必要に応じて外して下さい。このシェルスクリプトはzshでもそのまま実行できます。zshの場合、echoコマンドはエスケープがオプションなしで有効になっており、-eは単純に無視されるので、問題なく動きます。アンチGNUの人はzshで実行すると良いでしょう。このシェルスクリプトを作ろうと考えたときは、POSIX互換で作るつもりだったんですが、echoコマンドは互換性に難があるprintfコマンドでバイナリを出力する場合、POSIX互換なら8進数指定が必要で面倒ということが分かり、諦めました。実はbashにはTCPやUDP通信を行う機能があります。bashのmanページを見てみましょう。socket.つまりbash上で/dev/udp/HOST/PORTファイルに書き込むとUDP通信が行われます。これを使えばncコマンドが不要になり、本当にbashのみでWoLが出来る、と期待したのですが、うまく行きませんでした。ブロードキャストは出来ないようです。ターゲットマシンにマジックパケットが届けば、同じネットワークでなくてもいいし、ブロードキャストでなくてもいいですが、起動していないマシンにはIPアドレスがないので(簡単には)パケットを送ることができません。echo)でも生IPでも生ethernetフレームでも良いのですが、UDPが通常一番簡単です。