os.executeを使用せずにサーバにpingを実行する方法があるかどうか不思議です。目的はサーバーが稼働しているかどうかを確認することです。luaでサーバにpingを実行
私はluaソケットライブラリをチェックしましたが、ICMPがサポートされているとは思いませんか?何か案が?
os.executeを使用せずにサーバにpingを実行する方法があるかどうか不思議です。目的はサーバーが稼働しているかどうかを確認することです。luaでサーバにpingを実行
私はluaソケットライブラリをチェックしましたが、ICMPがサポートされているとは思いませんか?何か案が?
私の知る限り、いいえ、ルートアクセスなしでICMP rawパケットを送信することはできません。これはルアの制限ではなく、OSの制限です。
rootアクセスを得るには、Luaを使ってアプリケーション全体をSUIDルートに変更するのではなく、うまくテストされた小さなプログラムをSUIDルートにするのが最善の方法です。つまり、os.execute()を使用して終了します。独自のプログラムを作成するのではなく、OSがping
を提供していることは、あなたの問題を解決するための素晴らしいコマンドのようです。
これは理想的ではないことに同意します(特に、さまざまなpingコマンドを処理するためのOS固有のコードが作成されるため)。しかし、SUID関数呼び出しがなければ、もっと良い方法はないと思います。
Linuxカーネル3.0以降、ユーザーモードのICMPソケットがあります。 – daurnimator
@daurnimatorに関するリンクや詳細はありますか? Linuxカーネル3.0以上であれば、それはLuaライブラリのいくつかにもOS固有のものかもしれません。しかし、これは自分自身をロールバックするオプションを提供します。 – BMitch
io.popen()を使用すると、pingコマンドを実行できます。 たとえば、
local handler = io.popen("ping -c 3 -i 0.5 10.10.10.10")
local response = handler:read("*a")
print(response)
ルア男ではありませんが、これはうまくいくと思います。 popenを使用し、返されたストリームを読み取る例では、答えがより強くなる可能性があります。 – Windle
これをルートとして実行しますか? pingコマンドはLinux上ではsuid rootですが、ICMPは直接使用するための特権が必要だと思います。 – BMitch
いいえ、好ましくはrootではありません。通常のユーザとしてlua-socketを使用してICMP未加工パケットを送信することはできませんか?そして、どのパケット? – ripat