Wake on LANのついでに、QNAPでPHPからPINGしようとしてハマったときの話。
【QNAP】QNAPで他のPCをWakeOnLan出来るようにする その2【PHP】
普通にPHPからpingするには、以下のコマンドを使用します。
<pre><!--?php
$host="cherry-box.net";
exec("ping $host", $output, $result);
echo $output;
echo $result;
?-->
</pre>
しかしQNAPのPHP上でこれを実行してもうまく実行できません。
pingを送信の際にICMPを使用するのですが、これが一般ユーザーに許可されていないためです。
この場合の解決方法は大きく2つあります。
- pingコマンドにStickyBitを設定してrootユーザーとして実行
- pingコマンドにcapability(CAP_NET_RAW)を設定する
参考:
望ましいのは言うまでもなく後者。
余計な権限は付与しないに越したことはない。
しかしQNAPのNASにはcapabilityに関連するコマンドは入っていないので、当面はpingコマンドにStickyBitで対応することにしました。
何とも姑息的解決法。
しかし、よくよく見てみると、 pingコマンド自体がbusyboxへのエイリアスになっていて、pingだけStickyBitを付けることができない!!
cpやrm、chmod等のコマンドも含まれるので、
間違ってもbusyboxそのものにStickyBitを付けてはいけない。
そんなわけで更に姑息的な解決方法…
- 別のpingバイナリを入れる
以前導入したopkgにiputils-pingというパッケージがあるので、それを導入する。
そしてこのコマンドにStickyBitを設定して、rootユーザーで実行されるようにします。
これでどうにかPHP上からpingが出来るようになりました。
php上から呼び出す場合は、フルパスで明示的にiputilsのpingを呼び出すように指定します。
<pre><!--?php
$host="cherry-box.net";
exec("/opt/bin/ping $host", $output, $result);
echo $output;
echo $result;
?-->
</pre>
まとめ
こういう組み込み系に近い機器は、Web設定画面だけで設定が完結できるような、メーカーが想定してる使い方であればとても簡単です。
しかしそれ以上のことをやろうとすると、普通のlinuxと違っていたりして解決方法を探すのがとても面倒ですね…(*´Д`)