7

実行に root ユーザー権限が必要なアプリケーションを作成しています。root 以外のユーザーが実行すると、終了し、次のような perror メッセージで終了します。

    pthread_getschedparam: Operation not permitted

アプリをもっと使いやすくしたい。初期初期化の一環として、ルートによって実行されているかどうかを確認したいと思います。root 以外の場合は、root のみが実行できることを示すメッセージを表示してから終了します。

4

4 に答える 4

19

getuidまたはgeteuid明らかな選択肢になります。

getuid実際のユーザーの資格情報をチェックします。

追加されeた ingeteuidは の略ですeffective。有効な資格情報をチェックします。

たとえば、sudoroot (スーパーユーザー) としてプログラムを実行する場合、実際の資格情報は依然として自分のアカウントですが、有効な資格情報は 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 の資格情報を返すため、「別のユーザーとして実行中」と表示されます。

于 2010-07-09T15:54:21.003 に答える
14
#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;
}
于 2010-07-09T16:20:48.827 に答える
12

この変更を行うのではなく、エラー メッセージを改善することお勧めします。アプリケーションが実際に「ルートになる」必要があるかどうかは疑わしいです。代わりに、ルートが持つ特定の権限が必要ですが、きめ細かなセキュリティ制御を備えたオペレーティング システムは、完全なルート アクセスを許可せずにアプリケーションに付与できる可能性があります。現在それが不可能であっても、今から 6 か月または 2 年後には可能になる可能性があります。実行に成功したことを確認するだけでなく、パーミッション モデルに関する逆の仮定に基づいてプログラムが実行を拒否している場合、ユーザーはイライラするでしょう。必要な特権操作。

于 2010-07-09T15:54:39.663 に答える
5

本当に確認したいのは、適切な機能セット (CAP_SYS_NICE必要な機能だと思います) があるかどうかです。man ページcapabilities (7)を参照してください。capget (2)このようにして、必要なことを行う機能がある場合はエラーになりませんが、ルート化しないでください。

于 2010-07-09T16:01:25.183 に答える