Wie kann ich den Benutzernamen des aktuellen Benutzers in Bash erhalten?

319

Ich schreibe ein Programm in Bash, das den Benutzernamen des Benutzers erhalten muss.

Ich habe von einem Ding namens gehört whoami, aber ich habe keine Ahnung, was es tut oder wie man es benutzt.

Mit welchem ​​Befehl kann ich den aktuellen Benutzernamen abrufen?

George
quelle
Es scheint, dass keine der bisher vorgeschlagenen Methoden funktioniert, ohne sich auf $ USER zu verlassen oder einen separaten Prozess aufzurufen. Ist keine Bash integriert, um den Benutzernamen abzurufen, ohne einen separaten Prozess aufzurufen?
ColinM
9
Wenn Sie einen Befehl gehört haben, sich aber nicht sicher sind, wie Sie ihn verwenden sollen, ist die Überprüfung man whoaminormalerweise ein guter erster Stopp, um nach Dokumentation zu suchen.
Mark Stosberg

Antworten:

467

Geben Sie in der Befehlszeile ein

whoami

oder

echo "$USER"

Führen Sie die folgenden Schritte aus, um diese Werte in einer Variablen zu speichern

myvariable=$(whoami)

oder

myvariable=$USER

Natürlich müssen Sie keine Variable erstellen, da dies der Zweck der $USERVariablen ist.

SethMMorton
quelle
53
Nur eine kurze Anmerkung, dass $ USER und whoami unterschiedliche Werte zurückgeben, wenn Sie als anderer Benutzer einen Befehl über ssh ausführen. whoami gibt den Betriebssystembenutzer zurück und $ USER gibt den ssh-Benutzer zurück.
BillMan
4
@ BillMan, was bedeutet das überhaupt? Könnten Sie ein Beispiel geben?
Dejay Clayton
17
In einigen Fällen $USERist überhaupt nicht eingestellt. Schlimmer noch, es ist nur eine Umgebungsvariable, so dass es vom Benutzer überschrieben werden kann:USER=thisisnotmyname bash -c 'echo $USER' # prints thisisnotmyname
sitaktif
1
@sitaktif Was schlagen Sie als Lösung für dieses Problem vor?
SethMMorton
3
@ SethMMorton Mir ist klar, dass ich das Problem schlimmer klingen ließ als es normalerweise ist. Um die Frage zu beantworten, wird whoamidas Problem durch die Verwendung (wie von Ihnen vorgeschlagen) vollständig beseitigt, vorausgesetzt, überschriebene Umgebungsvariablen sind ein potenzielles Problem in Ihrem Kontext.
Sitaktif
81

Eine Alternative zu whoamiist id -u -n.

id -ugibt die Benutzer-ID zurück (zB 0 für root ).

Brett
quelle
5
Wenn ich mich nicht irre, wäre dies der richtige Weg, wenn die Portabilität ein Problem darstellt, da der idBefehl -uund die -nFlags Teil von posix sind
3
Dies sollte wirklich die akzeptierte Antwort sein. "${USER}"undwhoami beide hängen davon ab, wie Sie sich anmelden. Insbesondere setzen Login-Shells und sudo $ USER und sehen whoamiden an stdin angehängten Benutzer an. Wenn Sie jedoch einen Stapeljob von cron ausführen oder ein Startskript als anderer Benutzer als root ausführen, geben diese entweder den falschen Benutzer (root) oder gar nichts aus. Diese Antwort gibt den korrekten Wert zurück, unabhängig von der Benutzer-ID des Prozesses.
Asfand Qazi
Dies ist nicht nützlich, wenn Sie den Benutzernamen anstelle der ID wollen
Jonathan
2
Wenn Sie den Befehl ausprobieren, bevor Sie unwahre Kommentare hinzufügen, sehen Sie, dass die -n Argument den Benutzernamen genau wie die ursprünglich gestellte Frage ausgibt. siehe folgendes: id -u -ndrucke brett- auch auf darwin.
Brett
20

Verwenden Sie den Standardbefehl Unix / Linux / BSD / MacOS logname, um den angemeldeten Benutzer abzurufen. Dies ignoriert sowohl die Umwelt als auch Sudo, da es sich um unzuverlässige Reporter handelt. Es wird immer der Name des angemeldeten Benutzers gedruckt und dann beendet. Dieser Befehl gibt es seit etwa 1981.

My-Mac:~ devin$ logname
devin
My-Mac:~ devin$ sudo logname
Password:
devin
My-Mac:~ devin$ sudo su -
My-Mac:~ root# logname
devin
My-Mac:~ root# echo $USER
root
Devin R.
quelle
17

Ein Hack, den ich unter Solaris 9 und Linux verwendet habe und der für beide gut funktioniert:

ps -o user= -p $$ | awk '{print $1}'

Dieses Snippet druckt den Namen des Benutzers mit der aktuellen EUID.

HINWEIS: benötigen Sie Bash als Dolmetscher.

Unter Solaris haben Sie Probleme mit den oben beschriebenen Methoden:

  • idakzeptiert die Parameter -uund nicht -n(daher müssen Sie die Ausgabe analysieren)
  • whoami existiert nicht (standardmäßig)
  • who am I druckt den Besitzer des aktuellen Terminals (ignoriert EUID)
  • $USERVariable wird erst nach dem Lesen von Profildateien richtig gesetzt (zum Beispiel /etc/profile)
Elvenfighter
quelle
1
Warum brauchst du Bash als Dolmetscher? Nichts in der angezeigten Befehlszeile scheint für eine Shell spezifisch zu sein. Warum sollte man das Rohr überhaupt durch awk einschließen? Soweit ich das beurteilen kann, ist Ihr psBefehl alles, was erforderlich ist, um den Eigentümer der PID der aktuellen Shell anzuzeigen.
Ghoti
Für uns Menschen ist es selbstverständlich, die überflüssigen Informationen zu ignorieren. Der awk-Teil isoliert die gewünschten Daten - für Variablen oder allgemein für den Computer, der auf dieser rudimentären Ebene noch keine spontanen Annahmen treffen kann.
BradChesney79
Verwenden Sie unter Solaris command -p id(aus einer POSIX-Shell) oder /usr/xpg4/bin/id. Im Allgemeinen möchten Sie unter Solaris Ihre Umgebung so ändern, dass Sie sich in einer POSIX-Umgebung befinden (mit etwas wie PATH=getconf PATH` und sicher sein, dass es ausgeführt wird /usr/xpg4/bin/sh), um nicht an Befehlen aus den 70er / 80er Jahren hängen zu bleiben.
Stephane Chazelas
'ps: unbekannte Option - o'
Anand Rockzz
12

Zwei Befehle:

  1. id druckt die Benutzer-ID zusammen mit den Gruppen. Format:uid=usernumber(username) ...

  2. whoami gibt den aktuellen Benutzernamen an

Sireesh Yarlagadda
quelle
1
$ whoami ist in bash nicht als Variable verfügbar . Sie müssen entweder $ (whoami) oder `whoami` ausführen, um den whoami-Befehl tatsächlich auszuführen!
Rudolf Mayer
@ RudolfMayer Ich habe es behoben
wjandrea
6

Wenn Root-Berechtigungen (Sudo-Berechtigungen) erforderlich sind, die bei Verwendung von Skripten normalerweise 90% + betragen, geben Ihnen die Methoden in den vorherigen Antworten immer rootdie Antwort.

Das Abrufen des aktuellen "angemeldeten" Benutzers ist genauso einfach, erfordert jedoch den Zugriff auf verschiedene Variablen: $SUDO_UIDund $SUDO_USER.

Sie können wiederholt werden:

echo $SUDO_UID
echo $SUDO_USER

Oder zugewiesen, zum Beispiel:

myuid=$SUDO_UID
myuname=$SUDO_USER
OldManRiver
quelle
6

In Solaris OS habe ich diesen Befehl verwendet:

$ who am i     # Remember to use it with space.

Unter Linux - Jemand hat dies bereits in Kommentaren beantwortet.

$ whoami       # Without space
Lin-Mann
quelle
5

Für Bash , KornShell ( ksh) shusw. Viele Ihrer Fragen werden schnell beantwortet durch:

man [function]

So erhalten Sie die Dokumentation für das von Ihnen verwendete System oder in der Regel bequemer:

Google "Mann Funktion"

Dies kann zu unterschiedlichen Ergebnissen führen, wenn Linux und Unix geringfügige Unterschiede aufweisen.

Für diese Frage geben Sie einfach "whoami" in Ihre Shell ein.

So schreiben Sie ein Skript:

myvar=$(whoami)
Fred Mitchell
quelle
2

Der Benutzername des aktuellen Benutzers kann in reinem Bash mit der ${parameter@operator}Parametererweiterung (eingeführt in Bash 4.4) abgerufen werden:

$ : \\u
$ printf '%s\n' "${_@P}"

Das :integrierte (Synonym von true) wird anstelle einer temporären Variablen verwendet, indem das letzte Argument festgelegt wird, in dem gespeichert ist $_. Wir erweitern es dann ( \u), als wäre es eine Eingabeaufforderungszeichenfolge mit dem POperator.

Dies ist besser als die Verwendung $USER, da $USERes sich nur um eine reguläre Umgebungsvariable handelt. Es kann geändert, deaktiviert usw. werden. Auch wenn es nicht absichtlich manipuliert wird, ist ein häufiger Fall, in dem es immer noch falsch ist, wenn der Benutzer gewechselt wird, ohne eine Anmeldeshell zu starten ( suStandardeinstellung).

Crestwave
quelle
1

Auf den meisten Linux-Systemen liefert die Benutzer-ID, wenn Sie einfach whoami in die Befehlszeile eingeben .

Unter Solaris müssen Sie möglicherweise die Benutzer-ID ermitteln, indem Sie die UID des angemeldeten Benutzers über den folgenden Befehl ermitteln.

echo $UID

Sobald die UID bekannt ist, suchen Sie den Benutzer, indem Sie die UID mit der /etc/passwdDatei abgleichen .

cat /etc/passwd | cut -d":" -f1,3
John
quelle
-4

Ruft das user_struct der aktuellen Aufgabe ab

#define get_current_user()              \
({                                      \
    struct user_struct *__u;            \
    const struct cred *__cred;          \
    __cred = current_cred();            \
    __u = get_uid(__cred->user);        \
    __u;                                \
})
leesagacious
quelle
2
Die Frage war, wie man den Benutzernamen in ein Bash-Skript bekommt. In dieser Antwort geht es darum, wie Sie die numerische Benutzer-ID (nicht den Benutzernamen) aus C-Code abrufen, der im Linux-Kernel ausgeführt wird (z. B. von einem benutzerdefinierten Linux-Kernelmodul). Es ist keine Antwort auf die gestellte Frage, es ist eine Antwort auf eine andere Frage.
Simon Kissane