私が実行しているプログラムにはルート権限が必要なため、で実行されますがsudo
、実行しているユーザーを知る必要もあります。getuid
両方とgeteuid
も戻りroot
ます。実際のユーザーのユーザー名 (または uid) を取得するにはどうすればよいですか?
ありがとう!
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
したがって、この機能に依存する必要がある場合は、ユーザーにコマンドを付与しないようにしてください。
監査システムが提供する Linux 固有のaudit_getloginuid()
機能が役立つ場合があります。はpam_loginuid(8)
「メイン」デーモン ( sshd
、login
、など) に対してのみインストールされるため、実行gdm
時に監査 uid は変更されません。sudo(8)
これには少し設定が必要です。追加:
session required pam_loginuid.so
ユーザーに/etc/pam.d/sshd
使用を許可するその他のサービス。
構成ファイルpam_loginuid.so
にロードされていないことを確認します。/etc/pam.d/sudo
あなたには2つの良い選択肢があります...
アップデート:
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 できます。
簡単な方法は、Who am i を使用することです
who am i | awk '{print $1}'
また
who am i | cut -f1 -d" "