web-dev-qa-db-ja.com

ユーザーがCのrootかどうかを確認しますか?

ユーザーがrootかどうかを確認するにはどうすればよいですか?

37
Mohit Deshpande

通常、ユーザーが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 は、実際の意味によって異なります。どちらの場合も、0はルートを意味します。

if(geteuid() != 0)
{
  // Tell user to run app as root, then exit.
}

Rによるポイントは有効です。試行錯誤、またはrootを明示的に必要としない別のアプローチを検討する必要があります。

33

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;
}