実行に root ユーザー権限が必要なアプリケーションを作成しています。root 以外のユーザーが実行すると、終了し、次のような perror メッセージで終了します。
pthread_getschedparam: Operation not permitted
アプリをもっと使いやすくしたい。初期初期化の一環として、ルートによって実行されているかどうかを確認したいと思います。root 以外の場合は、root のみが実行できることを示すメッセージを表示してから終了します。
getuid
またはgeteuid
明らかな選択肢になります。
getuid
実際のユーザーの資格情報をチェックします。
追加されe
た ingeteuid
は の略ですeffective
。有効な資格情報をチェックします。
たとえば、sudo
root (スーパーユーザー) としてプログラムを実行する場合、実際の資格情報は依然として自分のアカウントですが、有効な資格情報は root アカウント (または wheel グループのメンバーなど) の資格情報です。
たとえば、次のようなコードを検討してください。
#include <unistd.h>
#include <iostream>
int main() {
auto me = getuid();
auto myprivs = geteuid();
if (me == myprivs)
std::cout << "Running as self\n";
else
std::cout << "Running as somebody else\n";
}
これを通常どおりに実行するgetuid()
とgeteuid()
、同じ値が返されるため、「running as self」と表示されます。sudo ./a.out
代わりにgetuid()
はユーザー ID を返しますが、geteuid()
root または wheel の資格情報を返すため、「別のユーザーとして実行中」と表示されます。
#include <unistd.h> // getuid
#include <stdio.h> // printf
int main()
{
if (getuid()) printf("%s", "You are not root!\n");
else printf("%s", "OK, you are root.\n");
return 0;
}
この変更を行うのではなく、エラー メッセージを改善することをお勧めします。アプリケーションが実際に「ルートになる」必要があるかどうかは疑わしいです。代わりに、ルートが持つ特定の権限が必要ですが、きめ細かなセキュリティ制御を備えたオペレーティング システムは、完全なルート アクセスを許可せずにアプリケーションに付与できる可能性があります。現在それが不可能であっても、今から 6 か月または 2 年後には可能になる可能性があります。実行に成功したことを確認するだけでなく、パーミッション モデルに関する逆の仮定に基づいてプログラムが実行を拒否している場合、ユーザーはイライラするでしょう。必要な特権操作。
本当に確認したいのは、適切な機能セット (CAP_SYS_NICE
必要な機能だと思います) があるかどうかです。man ページcapabilities (7)
を参照してください。capget (2)
このようにして、必要なことを行う機能がある場合はエラーになりませんが、ルート化しないでください。