Es gibt kein perfekt Antworten. Wenn Sie Benutzer-IDs ändern, wird die ursprüngliche Benutzer-ID normalerweise nicht beibehalten, sodass die Informationen verloren gehen. Einige Programme, wie logname
und who -m
Implementieren Sie einen Hack, bei dem sie überprüfen, welches Terminal mit stdin
verbunden ist , und überprüfen Sie dann, welcher Benutzer an diesem Terminal angemeldet ist.
Diese Lösung häufig funktioniert, ist aber nicht narrensicher und sollte sicherlich nicht als sicher angesehen werden. Stellen Sie sich zum Beispiel vor, wenn who
gibt folgendes aus:
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
verwendet su
um zu root zu gelangen, und führt Ihr Programm aus. Wenn STDIN
nicht umgeleitet wird, dann ein Programm wie logname
gibt tom
aus . Wenn es umgeleitet wird (z. B. von einer Datei) so:
logname < /some/file
Dann ist das Ergebnis "no login name
", da die Eingabe nicht das Terminal ist. Noch interessanter ist jedoch die Tatsache, dass der Benutzer sich als ein anderer angemeldeter Benutzer ausgeben könnte. Da Joe auf pts/1 angemeldet ist, könnte Tom vorgeben, er zu sein, indem er läuft
logname < /dev/pts1
Jetzt heißt es joe
obwohl Tom derjenige ist, der das Kommando ausgeführt hat. Mit anderen Worten, wenn Sie diesen Mechanismus in irgendeiner Sicherheitsrolle verwenden, sind Sie verrückt.
Ergebnisse:
Verwenden Sie who am i | awk '{print $1}'
ODER logname
da keine anderen Methoden garantiert werden.
Angemeldet als ich selbst:
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>
Normales 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>
sudo su - :
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 ]#
sudo su -; su tom :
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$
Dies ist ein ksh
Funktion, die ich auf HP-UX geschrieben habe. Ich weiß nicht, wie es mit Bash
funktionieren wird unter Linux. Die Idee ist, dass die sudo
Der Prozess wird als ursprünglicher Benutzer ausgeführt und die untergeordneten Prozesse sind der Zielbenutzer. Indem wir durch übergeordnete Prozesse zurückgehen, können wir den Benutzer des ursprünglichen Prozesses finden.
#
# 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
}
Ich weiß, dass die ursprüngliche Frage schon lange her ist, aber Leute (wie ich) stellen immer noch Fragen und dies schien ein guter Ort zu sein, um die Lösung zu platzieren.