ユーザーがrootかどうかを確認するにはどうすればよいですか?
通常、ユーザーがrootであるかどうかをテストするのは誤りです。 POSIXはrootユーザーも必要としませんが、権限がどのように機能するかを決定する実装に任せます。次のようなコード:
if (i_am_root) do_privileged_op(); else print_error();
rootが必要な特権操作を実行する必要がない高度な特権モデルでユーザーを本当に困らせます。 Linuxでのcd書き込みの初期の頃を思い出します。cdrecord
ソース全体をハックして、ルートとして実行されているかどうかを確認するために不要なチェックをすべて削除しました。読んだ /dev/sga
。
代わりに、常にattempt実行する必要のある特権操作を実行し、十分な特権がないことをユーザーに通知できない場合はEPERM
または同様のものを確認してください(そしておそらく実行を再試行する必要があります)ルートとして)。
Rootを確認するのに役立つ1つのケースは、プログラムが「suid-root」で呼び出されたかどうかを確認することです。適切なテストは次のとおりです。
uid_t uid=getuid(), euid=geteuid();
if (uid<0 || uid!=euid) {
/* We might have elevated privileges beyond that of the user who invoked
* the program, due to suid bit. Be very careful about trusting any data! */
} else {
/* Anything goes. */
}
Uid/euidを取得するための呼び出しのいずれかが失敗する可能性(抜粋ですが、偏執狂的であることが最善です)を考慮し、失敗した場合はsuidであり、悪意のあるユーザーが何らかの方法で私たちがsuidしていることを隠そうとして、syscallが失敗しました。
getuidまたはgeteuidを使用することをお勧めしますが、それはzconf.hヘッダーファイルにあり、次のように入力する必要があります。
#include <zconf.h>
#include <stdio.h>
int main()
{
int a;
a=getuid();
//or you can use a=geteuid();
//euid is effective user id and uid is user id
// both euid and uid are zero when you are root user
if (a==0){
printf("you are root user");
//so you can do what`enter code here`ever `enter code here` you want as root user
}
else
printf("please run the script as root user !");
return 0;
}