Wenn ich ein Skript über sudo oder su ausführe, möchte ich den ursprünglichen Benutzer erhalten. Dies sollte unabhängig von mehreren sudo
oder su
ineinander und spezifisch geschehen sudo su -
.
89
Ergebnisse:
Verwenden Sie who am i | awk '{print $1}'
OR, 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$
who | awk '{print $1}'
who am i
ist das gleiche wiewho smells bad
. Außerdem funktioniert es nur, wennSTDIN
es einem TTY zugeordnet ist. Wenn Sie es ausführenecho "hello" | who am i
, funktioniert es einfach nicht.echo "hello" | who am i
normal ausgeführt, es sei denn, Ihr Skript wird in einer Umgebung ausgeführt, in der kein Terminal vorhanden ist. Dann sehen Sie möglicherweise den Fehler, derwho am i
nicht funktioniert, weil es ein Problem mit dem nicht lesbaren Standard gibt. In diesem Fall können Sie versuchen, Datenwho am i
aus Verzweiflung weiterzuleiten, um die Standardanforderungen zu erfüllen. tylerl bemerkt nur, dass er diesen weg bereits eingeschlagen hat und die Pipe nicht funktioniert, da stdin sowohl lesbar als auch mit einem TTY verknüpft sein muss.logname
jetzt, was, wie sich herausstellt, funktioniert, wowho am i
nicht.Es gibt keine perfekte Antwort. Wenn Sie Benutzer-IDs ändern, wird die ursprüngliche Benutzer-ID normalerweise nicht beibehalten, sodass die Informationen verloren gehen. Einige Programme, wie z. B.
logname
undwho -m
implementieren einen Hack, bei dem überprüft wird, mit welchem Terminal verbunden iststdin
, und anschließend überprüft wird, welcher Benutzer an diesem Terminal angemeldet ist.Diese Lösung funktioniert oft , ist aber nicht kinderleicht und sollte auf keinen Fall als sicher angesehen werden. Stellen Sie sich zum Beispiel vor, Sie geben
who
Folgendes aus:tom
wird verwendetsu
, um zu root zu gelangen, und führt Ihr Programm aus. WennSTDIN
nicht umgeleitet wird, wird ein Programm wielogname
ausgegebentom
. Wenn es wie folgt umgeleitet wird (z. B. aus einer Datei):Dann ist das Ergebnis "
no login name
", da der Eingang nicht das Terminal ist. Interessanter ist jedoch die Tatsache, dass sich der Benutzer als ein anderer angemeldeter Benutzer ausgeben könnte. Da Joe bei pts / 1 angemeldet ist, könnte Tom vorgeben, er zu sein, indem er renntJetzt heißt es,
joe
obwohl Tom derjenige ist, der den Befehl ausgeführt hat. Mit anderen Worten, wenn Sie diesen Mechanismus in irgendeiner Sicherheitsrolle verwenden, sind Sie verrückt.quelle
Dies ist eine
ksh
Funktion, die ich unter HP-UX geschrieben habe. Ich weiß nicht, wie es unterBash
Linux funktionieren wird . Die Idee ist, dass dersudo
Prozess als der ursprüngliche Benutzer ausgeführt wird und die untergeordneten Prozesse der Zielbenutzer sind. Durch Zurücklaufen durch übergeordnete Prozesse können wir den Benutzer des ursprünglichen Prozesses finden.Ich weiß, dass die ursprüngliche Frage von vor langer Zeit stammt, aber Leute (wie ich) fragen immer noch und dies schien ein guter Ort zu sein, um die Lösung zu finden.
quelle
Wie wäre es mit logname (1), um den Anmeldenamen des Benutzers zu erhalten?
quelle
logname(1)
funktioniert nicht, funktioniert aberlogname
- die obigen Ergebnisse hinzufügen$LOGNAME
aber das hat nicht funktioniert. Auch zu den obigen Ergebnissen hinzugefügt.logname
noch ein tty? Bei meinen Tests besteht es immer. (Vielleicht habe ich etwas falsch gemacht.) Ich verwende Linux mit Coreutils 8.26.Das ist das einzige, was für mich funktioniert hat.
quelle
Die findUser () -Funktion von user1683793 wurde portiert
bash
und erweitert, sodass auch in NSS-Bibliotheken gespeicherte Benutzernamen zurückgegeben werden.quelle
zurückfahren und eine Liste der Benutzer geben
basierend auf der Antwort von user1683793
Durch das Ausschließen von Nicht-TTY-Prozessen überspringe ich root als Initiator der Anmeldung. Ich bin mir nicht sicher, ob dies in einigen Fällen zu viel ausschließen kann
logname
oderwho am i
habe ich nicht die gewünschte Antwort, vor allem nicht in längeren Listensu user1
,su user2
,su user3
,...
Ich weiß, dass die ursprüngliche Frage von vor langer Zeit stammt, aber Leute (wie ich) fragen immer noch und dies schien ein guter Ort zu sein, um die Lösung zu finden.
quelle
Alternative zum mehrmaligen Aufruf von ps: Führen Sie einen pstree-Aufruf durch
Ausgabe (wenn als gerade angemeldet):
(evan)
pstree Argumente:
Holen Sie sich die erste Benutzeränderung (die Anmeldung ist) mit
grep -o
undhead
.Einschränkung: Der Befehl darf keine geschweiften Klammern enthalten
()
(normalerweise nicht).quelle