Wake on LANのついでに、QNAPでPHPからPINGしようとしてハマったときの話。
【QNAP】QNAPで他のPCをWakeOnLan出来るようにする その2【PHP】
普通にPHPからpingするには、以下のコマンドを使用します。
1 2 3 4 5 6 |
<?php $host="cherry-box.net"; exec("ping $host", $output, $result); echo $output; echo $result; ?> |
しかし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というパッケージがあるので、それを導入する。
1 |
opkg install iputils-ping |
そしてこのコマンドにStickyBitを設定して、rootユーザーで実行されるようにします。
1 |
chmod 4755 /opt/bin/ping |
これでどうにかPHP上からpingが出来るようになりました。
php上から呼び出す場合は、フルパスで明示的にiputilsのpingを呼び出すように指定します。
1 2 3 4 5 6 |
<?php $host="cherry-box.net"; exec("/opt/bin/ping $host", $output, $result); echo $output; echo $result; ?> |
まとめ
こういう組み込み系に近い機器は、Web設定画面だけで設定が完結できるような、メーカーが想定してる使い方であればとても簡単です。
しかしそれ以上のことをやろうとすると、普通のlinuxと違っていたりして解決方法を探すのがとても面倒ですね…(*´Д`)