リモートから、ホストマシン自体を再起動したい場合もある。
FileMakerのWebコンパニオンおよびWSC(WebServerConnect)はときどき、原因不明でおかしくなって反応しなくなる。本来であれば端末の前で正式な再起動の手続き(Finderメニューから再起動)をしたいところだけれど。
リモートから操作するには、リモートコントローラ系のサーバおよびクライアントソフトを使うこともできるが、利用者にある程度の知識が必要&そこそこの通信バンドがないと辛い。
そこで、なかば無理矢理的強制型いやだいやだといっても俺には通用しねいぜよい子はまねするな的方法でサーバを再起動する。
要するにWebブラウザ+Webサーバ+PHPを使ってマシンを再起動するにはということなんだけれど。
通常、PHPはnobadyやwwwユーザーといった、特別な権限の与えられていないユーザープロセスによって起動されているため、そこから直接、マシンの再起動や、シャットダウン等、管理的コマンドを操作することができない。
単純に、
exec("/sbin/reboot");
?>
とやっても、ダメである。
そこで、まず、rootの権限をもって実行できるコマンドを作成する。
つまるところ、setuidという奴である。
適当なスクリプトで、rebootするコマンドを書く。注意したいのは、Perlはカーネルの設定によって、setuidができない場合が多い。Mac OS X 10.2.6もそうである。setuidしたPerlスクリプトを実行しようとすると、エラーメッセージが出る。
なので、今回はshで書いた。(といっても1行だけど)
で、そのスクリプトのオーナーをrootにし、chmod 4755等で、sビットを立てる。
そのスクリプトは、ブラウザから見える所に置いておくととても危険なので、apacheのDocumentRootからはずれた所におくべし。
で、そのスクリプトをphpからexecすれば、そのプロセスはroot権限によって動作するので、ブラウザから再起動できるようになる。
exec("/user/home/foo/reboot.sh"); // setuidしたスクリプトを起動
?>
もちろん、誰でもそのスクリプトにアクセスできないように、2重3重の制限を設けておくことを忘れないように。
本体の▲ボタンによる強制再起動よりは若干安全だが、本当であればFinder経由で再起動したい。
しかしながら、Webブラウザ経由で、Finderの再起動を実行する方法はまだ見つかっていない。コマンドラインから、openコマンドでアプリなりファイルなりを開けるから、そこでAppleScriptの実行形式を選べばいいのだろうけれど、AppleScriptでマシンを再起動する方法が分かってない。
どーも昔からAppleScriptが苦手。文法がむずかしすぎる。
別にAppleScriptじゃなくても、再起動するアプリでもいいんだけど。