【QNAP】QNAPでPHPからpingする方法【PHP】

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と違っていたりして解決方法を探すのがとても面倒ですね…(*´Д`)

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です