組み込みシステム(2.4カーネル)では、rootとして実行されていないプロセスからeth0インターフェースへのrawソケットアクセスが必要です。
コマンドラインからCAP_NET_RAW機能を設定し、プログラムでcap_set_proc()を使用してこの問題に対処しようとしましたが、どちらも成功しませんでした。私にはそうする権限がないようです。プログラムで、コマンドラインでEPERMエラーが発生します。
プロセス`1586'にキャップを設定できませんでした:(操作は許可されていません)
私がやりたいことをする簡単な方法はありますか?そうでない場合、CAP_NET_RAW機能を正常に設定するにはどのような手順が必要ですか?
編集:私はrootアクセス権を持っていますが、rootとしてプロセスを永続的に実行することはできません。libcapのバージョンは1.10で、「setcap」バイナリはありませんが、「setpcaps」があります。
編集-GeorgeSkoptsovに答える:
正しければ、setuidを使用してプロセスを開始し、CAP_NET_RAW機能を設定してから、特権を削除することをお勧めします。次のコードでこれを試しましたが、capsコマンドがエラーを返さないのに、機能しないようです。seteuid()がコメントアウトされると、rawアクセスが機能しますが、プロセスがrootとして実行されているため、次のようになります。
cap_t caps = cap_get_proc();
cap_value_t cap_list[1];
cap_list[0] = CAP_NET_RAW;
if (cap_set_flag(caps, CAP_EFFECTIVE, 1, cap_list, CAP_SET) == -1)
{
printf("cap_set_flag error");
}
if (cap_set_proc(caps) == -1)
{
printf("cap_set_proc error");
}
if (seteuid(getuid()) != 0)
{
printf("seteuid error");
}
function_that_needs_raw_access();
ご協力いただきありがとうございます。クリス