GNU/Linux >> Linux の 問題 >  >> Linux

root ユーザーがコマンドを実行しているかどうかを C/C++ アプリケーションで判断するにはどうすればよいですか?

getuid または geteuid 当然の選択でしょう。

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

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

たとえば、 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;
}

Linux
  1. インストールされている glibc ライブラリのバージョンを確認するにはどうすればよいですか?

  2. Linux の C/C++ でユーザー名を取得するには?

  3. PHP アプリケーションで Web ルート ディレクトリの外にある画像を表示するにはどうすればよいですか?

  1. コマンドラインでSVNにSSHパスワードを提供するにはどうすればよいですか?

  2. Linux でシェル アプリケーションの出力を非表示にするにはどうすればよいですか?

  3. dd コマンドの最適なバイト サイズを決定する方法

  1. コマンドラインを使用してLinuxでユーザーを削除する方法

  2. システム管理者(root)としてコマンドを実行する方法は?

  3. 端末がC/c ++プログラムで使用する文字エンコードを判別する方法は?