Wie finden Sie den ursprünglichen Benutzer über mehrere SUDO- und SU -Befehle?
Frage
Wenn Sie ein Skript über Sudo oder SU ausführen, möchte ich den ursprünglichen Benutzer erhalten. Dies sollte unabhängig von mehreren passieren sudo
oder su
läuft ineinander und spezifisch sudo su -
.
Lösung
Ergebnisse:
Verwenden who am i | awk '{print $1}'
ODER logname
Da keine anderen Methoden garantiert sind.
Als Selbst angemeldet:
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>
Normaler 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$
Andere Tipps
Da ist kein perfekt Antworten. Wenn Sie Benutzer -IDs ändern, bleibt die ursprüngliche Benutzer -ID normalerweise nicht erhalten, sodass die Informationen verloren gehen. Einige Programme wie z. logname
und who -m
Implementieren Sie einen Hack, bei dem sie prüfen, um herauszufinden, an welches Terminal verbunden ist stdin
, und dann überprüfen Sie, welcher Benutzer an diesem Terminal angemeldet ist.
Diese Lösung häufig Werkt, 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
Gebraucht su
Um auf Wurzeln zu gelangen und Ihr Programm auszuführen. Wenn STDIN
wird nicht umgeleitet, dann ein Programm wie logname
wird ausgeben tom
. Wenn es umgeleitet wird (zB aus einer Datei) als SO:
logname < /some/file
Dann ist das Ergebnis ""no login name
"Da die Eingabe nicht das Terminal ist. Interessanter ist jedoch noch immer die Tatsache, dass der Benutzer als anders angemeldete Benutzer posieren könnte. Da Joe bei PTS/1 angemeldet ist
logname < /dev/pts1
Jetzt heißt es joe
Obwohl Tom derjenige ist, der den Befehl geleitet hat. Mit anderen Worten, wenn Sie diesen Mechanismus in jeder Art von Sicherheitsrolle verwenden, sind Sie verrückt.
Das ist ein ksh
Funktion, die ich über HP-UX geschrieben habe. Ich weiß nicht, wie es funktionieren wird Bash
unter Linux. Die Idee ist, dass die sudo
Der Prozess wird als ursprünglicher Benutzer ausgeführt und die untergeordneten Prozesse sind der Zielbenutzer. Durch das Zurückfahren über Elternprozesse 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 von vor langer Zeit stammt, aber die Leute (wie ich) fragen immer noch, und dies sah nach einem guten Ort aus, um die Lösung zu setzen.
Wie wäre es mit LogName (1), um den Anmeldenamen des Benutzers zu erhalten?
THIS_USER=`pstree -lu -s $$ | grep --max-count=1 -o '([^)]*)' | head -n 1 | sed 's/[()]//g'`
Das ist das einzige, was für mich funktioniert hat.
Benutzer1683793s findUser () -Funktion portiert auf bash
Und erweitert, damit es Benutzernamen zurückgibt, die auch in NSS -Bibliotheken gespeichert sind.
#!/bin/bash
function findUser() {
thisPID=$$
origUser=$(whoami)
thisUser=$origUser
while [ "$thisUser" = "$origUser" ]
do
ARR=($(ps h -p$thisPID -ouser,ppid;))
thisUser="${ARR[0]}"
myPPid="${ARR[1]}"
thisPID=$myPPid
done
getent passwd "$thisUser" | cut -d: -f1
}
user=$(findUser)
echo "logged in: $user"
Zyklieren Sie zurück und geben Sie eine Liste von Benutzern
Basierend auf der Antwort von Benutzer1683793
Durch die Ausdauer von Nicht-Ty-Prozessen überspringe ich Root als Initiator der Anmeldung. Ich bin mir nicht sicher, ob das in einigen Fällen zu viel zu viel ausdrücken kann
#!/bin/ksh
function findUserList
{
typeset userList prevUser thisPID thisUser myPPid myPid myTTY myComm
thisPID=$$ # starting with this process-ID
while [ "$thisPID" != 1 ] # and cycling back to the origin
do
( ps -p$thisPID -ouser,ppid,pid,tty,comm ) | grep $thisPID | read thisUser myPPid myPid myTTY myComm
thisPID=$myPPid
[[ $myComm =~ ^su ]] && continue # su is always run by root -> skip it
[[ $myTTY == '?' ]] && continue # skip what is running somewhere in the background (without a terminal)
if [[ $prevUser != $thisUser ]]; then # we only want the change of user
prevUser="$thisUser" # keep the user for comparing
userList="${userList:+$userList }$thisUser" # and add the new user to the list
fi
#print "$thisPID=$thisUser: $userList -> $thisUser -> $myComm " >&2
done
print "$userList"
return 0
}
logname
oder who am i
gab mir nicht die gewünschte Antwort, insbesondere nicht in längeren Listen von su user1
, su user2
, su user3
, ...
Ich weiß, dass die ursprüngliche Frage von vor langer Zeit stammt, aber die Leute (wie ich) fragen immer noch, und dies sah nach einem guten Ort aus, um die Lösung zu setzen.
Alternative zum Aufrufen von PS mehrmals: Machen Sie einen Pstree -Anruf
pstree -lu -s $$ | grep --max-count=1 -o '([^)]*)' | head -n 1
Ausgabe (wenn er als gleichmäßig angemeldet ist): (evan)
Pstree -Argumente:
- -L: Lange Linien (nicht verkürzt)
- -U: Zeigen Sie, wann der Benutzer ändert (Benutzername)
- -S $$: Zeigen Sie den Eltern dieses Prozesses
Holen Sie sich die erste Benutzeränderung (die sich anmeldet) mit grep -o
und head
.
Einschränkung: Der Befehl kann keine Klammern enthalten ()
(Normalerweise nicht)