getuid
または geteuid
当然の選択でしょう。
getuid
実際のユーザーの資格情報をチェックします。
追加された e
geteuid
で 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 の認証情報が返されるため、"Running as someone other" と表示されます。
しないことをお勧めします この変更を行いますが、代わりにエラー メッセージを改善します。アプリケーションが実際に「ルートになる」必要があるかどうかは疑わしいです。代わりに、ルートが持つ特定の特権が必要ですが、きめ細かなセキュリティ制御を備えたオペレーティング システムは、完全なルート アクセスを許可せずにアプリケーションに付与できる可能性があります。現在それが不可能であっても、今から 6 か月後または 2 年後には可能になる可能性があります。プログラムが実行に成功したことを確認するだけでなく、パーミッション モデルに関する後方仮定に基づいて実行を拒否している場合、ユーザーはイライラするでしょう。必要な特権操作。
#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;
}