2012-01-13 15 views
2

os.executeを使用せずにサーバにpingを実行する方法があるかどうか不思議です。目的はサーバーが稼働しているかどうかを確認することです。luaでサーバにpingを実行

私はluaソケットライブラリをチェックしましたが、ICMPがサポートされているとは思いませんか?何か案が?

+0

これをルートとして実行しますか? pingコマンドはLinux上ではsuid rootですが、ICMPは直接使用するための特権が必要だと思います。 – BMitch

+0

いいえ、好ましくはrootではありません。通常のユーザとしてlua-socketを使用してICMP未加工パケットを送信することはできませんか?そして、どのパケット? – ripat

答えて

2

私の知る限り、いいえ、ルートアクセスなしでICMP rawパケットを送信することはできません。これはルアの制限ではなく、OSの制限です。

rootアクセスを得るには、Luaを使ってアプリケーション全体をSUIDルートに変更するのではなく、うまくテストされた小さなプログラムをSUIDルートにするのが最善の方法です。つまり、os.execute()を使用して終了します。独自のプログラムを作成するのではなく、OSがpingを提供していることは、あなたの問題を解決するための素晴らしいコマンドのようです。

これは理想的ではないことに同意します(特に、さまざまなpingコマンドを処理するためのOS固有のコードが作成されるため)。しかし、SUID関数呼び出しがなければ、もっと良い方法はないと思います。

+0

Linuxカーネル3.0以降、ユーザーモードのICMPソケットがあります。 – daurnimator

+0

@daurnimatorに関するリンクや詳細はありますか? Linuxカーネル3.0以上であれば、それはLuaライブラリのいくつかにもOS固有のものかもしれません。しかし、これは自分自身をロールバックするオプションを提供します。 – BMitch

2

io.popen()を使用すると、pingコマンドを実行できます。 たとえば、

local handler = io.popen("ping -c 3 -i 0.5 10.10.10.10") 
local response = handler:read("*a") 
print(response) 
+0

ルア男ではありませんが、これはうまくいくと思います。 popenを使用し、返されたストリームを読み取る例では、答えがより強くなる可能性があります。 – Windle