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?

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.


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

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`

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


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


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


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))
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.