完璧はありません 答え。ユーザー ID を変更すると、元のユーザー ID は通常保持されないため、情報は失われます。 logname
などの一部のプログラム と who -m
どの端末が stdin
に接続されているかをチェックするハックを実装します をクリックし、その端末にログインしているユーザーを確認します。
このソリューションはよく 動作しますが、絶対確実というわけではなく、確かに安全と見なすべきではありません。たとえば、who
の場合を想像してください。 以下を出力します:
tom pts/0 2011-07-03 19:18 (1.2.3.4)
joe pts/1 2011-07-03 19:10 (5.6.7.8)
tom
su
を使用 ルートになり、プログラムを実行します。 STDIN
の場合 リダイレクトされない場合、 logname
のようなプログラム tom
を出力します .リダイレクトされた場合 (ファイルからなど):
logname < /some/file
結果は「no login name
」 "、入力は端末ではないためです。さらに興味深いのは、ユーザーが別のログイン ユーザーになりすますことができるという事実です。Joe は pts/1 にログインしているため、Tom は次のコマンドを実行して彼のふりをすることができます。
logname < /dev/pts1
今、それは joe
と言っています コマンドを実行したのはトムですが。言い換えれば、このメカニズムを何らかのセキュリティ ロールで使用する場合、あなたは狂っています。
結果:
who am i | awk '{print $1}'
を使用 または logname
他の方法は保証されていないため.
自分としてログイン:
evan> echo $USER
evan
evan> echo $SUDO_USER
evan> echo $LOGNAME
evan
evan> whoami
evan
evan> who am i | awk '{print $1}'
evan
evan> logname
evan
evan>
通常のsudo:
evan> sudo -s
root> echo $USER
root
root> echo $SUDO_USER
evan
root> echo $LOGNAME
root
root> whoami
root
root> who am i | awk '{print $1}'
evan
root> logname
evan
root>
すどす - :
evan> sudo su -
[root ]# echo $USER
root
[root ]# echo $SUDO_USER
[root ]# echo $LOGNAME
root
[root ]# whoami
root
[root ]# who am i | awk '{print $1}'
evan
[root ]# logname
evan
[root ]#
須藤す -;ストム :
evan> sudo su -
[root ]# su tom
tom$ echo $USER
tom
tom$ echo $SUDO_USER
tom$ echo $LOGNAME
tom
tom$ whoami
tom
tom$ who am i | awk '{print $1}'
evan
tom$ logname
evan
tom$
これは ksh
です HP-UX で書いた関数。 Bash
でどのように動作するかわかりません Linuxで。アイデアは、 sudo
プロセスは元のユーザーとして実行され、子プロセスはターゲット ユーザーです。親プロセスに戻ることで、元のプロセスのユーザーを見つけることができます。
#
# The options of ps require UNIX_STD=2003. I am setting it
# in a subshell to avoid having it pollute the parent's namespace.
#
function findUser
{
thisPID=$$
origUser=$(whoami)
thisUser=$origUser
while [ "$thisUser" = "$origUser" ]
do
( export UNIX_STD=2003; ps -p$thisPID -ouser,ppid,pid,comm ) | grep $thisPID | read thisUser myPPid myPid myComm
thisPID=$myPPid
done
if [ "$thisUser" = "root" ]
then
thisUser=$origUser
fi
if [ "$#" -gt "0" ]
then
echo $origUser--$thisUser--$myComm
else
echo $thisUser
fi
return 0
}
元の質問がずっと前のものであることは知っていますが、人々 (私のような人) は今でも質問をしており、ここは解決策を置くのに適した場所のように見えました.