Identifizieren Sie den Benutzer in einem von sudo aufgerufenen Bash-Skript

107

Wenn ich das Skript erstelle, das Folgendes /root/bin/whoami.shenthält:

#!/bin/bash
whoami

und dieses Skript wird von einem Benutzer mit einem ordnungsgemäß konfigurierten Sudo aufgerufen

root

Gibt es eine schnelle Möglichkeit, den tatsächlichen Benutzer in einem Skript zu ermitteln, oder muss ich auf Parameter zurückgreifen, die diesen Benutzernamen weitergeben?

Quadmore
quelle

Antworten:

134

$ SUDO_USER funktioniert nicht, wenn Sie verwenden sudo su -.
Es erfordert auch mehrere Überprüfungen - wenn $USER == 'root'dann bekommen $SUDO_USER.

Anstelle des Befehls whoamiverwenden who am i. Dadurch wird der whofür die aktuelle Sitzung gefilterte Befehl ausgeführt. Es gibt Ihnen mehr Informationen als Sie brauchen. Tun Sie dies also, um nur den Benutzer zu erhalten:

who am i | awk '{print $1}'

Alternativ (und einfacher) können Sie verwenden logname. Es macht dasselbe wie die obige Aussage.

Dies gibt Ihnen den Benutzernamen, der sich bei der Sitzung angemeldet hat.

Diese funktionieren unabhängig von sudooder sudo su [whatever]. Es funktioniert auch unabhängig davon, wie oft suund sudoaufgerufen.

evan
quelle
2
Ja, +1 who am iist hier die Antwort.
Joe Kearney
43
Alternative zu who am iist who mom likes. Deine Entscheidung.
Wchargin
3
whoGibt 2 Zeilen für mich zurück, die beide meinen Namen enthalten, und who am ikeine. Irgendeine Hilfe?
Hosh Sadiq
7
Ich bin auf Ubuntu 16.04 und der Befehl who am itut nichts, es scheint einfach zu sein who, who | awk '{print $1}'funktioniert also wie erwartet;)
Daveoncode
1
Nur für den Fall, dass Sie nicht awkinstalliert haben, können Sie auch verwenden cut: who mom likes | cut -d' ' -f1 oder sedaus irgendeinem Grund: who mom likes | sed -n 's/^\([^ ]*\).*/\1/p'
Yzmir Ramirez
56

Ich denke $ SUDO_USER ist gültig.

#!/bin/bash
echo $SUDO_USER
whoami
Brandon Horsley
quelle
1
Seltsame Sache: sudo envzeigt SUDO_USER, sudo echo $SUDO_USERdruckt aber nichts ...
Job
17
Job, das ist nicht seltsam, es wird erwartet. in sudo echo $SUDO_USER, bash wertet $ SUDO_USER aus, bevor sudo ausgeführt wird. Probieren Sie das in dieser Lösung veröffentlichte Skript aus, es funktioniert.
@quadmore: Wenn Sie mit der Antwort zufrieden sind, vergessen Sie nicht, sie zu akzeptieren.
Job
2
Sie können auch verwenden echo ${SUDO_USER:-$USER}, um sowohl sudoals auch Nicht-Sudo-Laufen zu fangen . Aber Evans Antwort logname klingt einfacher
Tobias Kienzler
2
@TobiasKienzler - Und wie evan betont, $SUDO_USERfunktioniert nicht mit sudo su -, aber lognameimmer.
David Harkness
13

So erhalten Sie den Benutzernamen der Person, die das Skript aufgerufen hat, unabhängig davon, ob sudo oder nicht:

if [ $SUDO_USER ]; then user=$SUDO_USER; else user=`whoami`; fi

oder eine kürzere Version

[ $SUDO_USER ] && user=$SUDO_USER || user=`whoami`
Alexei Tenitski
quelle
8
noch kürzer: user=${SUDO_USER:-$(whoami)}oderuser=$(logname)
Tobias Kienzler
3

who am i | awk '{print $1}'hat nicht für mich gearbeitet, who|awk '{print $1}'wird aber den Job erfüllen

Srinivas
quelle
1
Nicht auf einem Host, auf dem mehr als ein Benutzer eine Sitzung hat
Roman Grazhdan
1

Seltsamerweise unterscheidet das System zwischen echten und effektiven UIDs , aber ich kann kein Programm finden, das dies auf Shell-Ebene exportiert.

msw
quelle
1

Mit whoami, who am i, who, idoder $SUDO_USERist hier nicht richtig.

Eigentlich whoist nie eine Lösung für die Frage, da nur die angemeldeten Benutzer aufgelistet werden, die Dutzende sein können ...

In meinen Augen ist die einzige wertvolle Antwort die Verwendung von logname.

Hoffe das hilft

rauben

rauben
quelle
0

Wenn es die UID ist, nach der Sie suchen (nützlich für Docker-Spielereien), dann funktioniert dies:

LOCAL_USER_ID=$(id -u $(logname))
Jim Hunziker
quelle