21

私が実行しているプログラムにはルート権限が必要なため、で実行されますがsudo、実行しているユーザーを知る必要もあります。getuid両方とgeteuidも戻りrootます。実際のユーザーのユーザー名 (または uid) を取得するにはどうすればよいですか?

ありがとう!

4

4 に答える 4

26

sudoこの場合に役立ついくつかの環境変数を提供します。

   SUDO_UID        Set to the user ID of the user who invoked
                   sudo

   SUDO_USER       Set to the login of the user who invoked sudo

steveayre はコメントで、ユーザーがこれらの環境変数を設定できる場合があると指摘しています。sudo(8)マンページには次の部分が含まれています。

The sudoers policy subjects variables
passed on the command line to the same restrictions as normal
environment variables with one important exception.  If the
setenv option is set in sudoers, the command to be run has the
SETENV tag set or the command matched is ALL, the user may set
variables that would otherwise be forbidden.  See sudoers(5)
for more information.

ALLしたがって、この機能に依存する必要がある場合は、ユーザーにコマンドを付与しないようにしてください。

于 2012-04-22T22:47:15.900 に答える
3

監査システムが提供する Linux 固有のaudit_getloginuid()機能が役立つ場合があります。はpam_loginuid(8)「メイン」デーモン ( sshdlogin、など) に対してのみインストールされるため、実行gdm時に監査 uid は変更されません。sudo(8)

これには少し設定が必要です。追加:

session    required     pam_loginuid.so

ユーザーに/etc/pam.d/sshd使用を許可するその他のサービス。

構成ファイルpam_loginuid.soにロードされていないことを確認します。/etc/pam.d/sudo

于 2012-04-22T22:57:33.897 に答える
2

あなたには2つの良い選択肢があります...

  1. sudo を信頼し、その環境だけを使用する
  2. プログラムを setuid-on-execution にすると、geteuid などが問題なく動作します。

アップデート:

setuid ビットは、実行可能ファイルの所有者の権限でプログラムを実行させるファイル モードのアクセス権フラグです。これが、sudo(1) が root として実行できる方法です... sudo プログラム自体にこのモードがあります。

$ ls -l /usr/bin/sudo
-r-s--x--x  1 root  wheel  272384 Jun 22  2009 /usr/bin/sudo*

プログラムを setuid ルートにするには、次のようにします。

$ chown root a.out
$ chmod +s a.out

言うまでもなく、setuid root プログラムは慎重に作成する必要があります。保護されたディレクトリまたはファイルへのアクセスのみが必要な場合は、権限の低いユーザーに setuid できます。

于 2012-04-22T23:15:43.950 に答える
1

簡単な方法は、Who am i を使用することです

who am i | awk '{print $1}'

また

who am i | cut -f1 -d" "
于 2020-09-09T09:09:54.367 に答える