Comment puis-je obtenir le nom d'utilisateur de l'utilisateur actuel dans Bash?

321

J'écris un programme dans Bash qui doit obtenir le nom d'utilisateur de l'utilisateur.

J'ai entendu parler d'une chose appelée whoami, mais je n'ai aucune idée de ce qu'elle fait ni de la façon de l'utiliser.

Quelle commande dois-je utiliser pour obtenir le nom d'utilisateur actuel?

George
la source
Il semble qu'aucune des méthodes proposées jusqu'à présent ne fonctionne sans compter sur $ USER ou invoquer un processus distinct. N'y a-t-il pas de bash intégré pour obtenir le nom d'utilisateur sans invoquer un processus séparé?
ColinM
9
Lorsque vous avez entendu une commande mais ne savez pas comment l'utiliser, la vérification man whoamiest généralement un bon premier arrêt pour vérifier la documentation.
Mark Stosberg

Réponses:

470

Sur la ligne de commande, entrez

whoami

ou

echo "$USER"

Pour enregistrer ces valeurs dans une variable, faites

myvariable=$(whoami)

ou

myvariable=$USER

Bien sûr, vous n'avez pas besoin de créer une variable car c'est à cela que sert la $USERvariable.

SethMMorton
la source
53
Juste une note rapide que $ USER et whoami renvoient des valeurs différentes si vous exécutez une commande via ssh en tant qu'autre utilisateur. whoami renvoie l'utilisateur du système d'exploitation et $ USER renvoie l'utilisateur ssh.
BillMan
4
@BillMan, qu'est-ce que cela signifie même? Pourriez-vous fournir un exemple?
Dejay Clayton
17
Dans certains cas, $USERn'est pas défini du tout. Pire encore, il s'agit simplement d'une variable d'environnement, elle peut donc être remplacée par l'utilisateur:USER=thisisnotmyname bash -c 'echo $USER' # prints thisisnotmyname
sitaktif
1
@sitaktif Que proposez-vous comme solution à ce problème?
SethMMorton
3
@SethMMorton Je me rends compte que j'ai rendu le problème plus grave que d'habitude. Pour répondre à la question, cependant, l'utilisation whoami(comme vous l'avez suggéré) élimine complètement le problème, en supposant que les variables d'environnement remplacées sont un problème potentiel dans votre contexte.
sitaktif
81

Une alternative à whoamiis id -u -n.

id -urenverra l'ID utilisateur (par exemple 0 pour root ).

Brett
la source
5
À moins que je ne me trompe, ce serait la voie à suivre si la portabilité est un problème car la idcommande -uet les -ndrapeaux font partie de posix
3
Cela devrait vraiment être la réponse acceptée. "${USER}"et les whoamideux dépendent de la façon dont vous vous connectez. Plus précisément, les shells de connexion et sudo définiront $ USER et whoamiexamineront l'utilisateur attaché à stdin. Cependant, si vous exécutez un travail par lots à partir de cron, ou si vous exécutez un script de démarrage en tant qu'utilisateur différent de root, ceux-ci produiront le mauvais utilisateur (root) ou rien du tout. Cette réponse renverra la valeur correcte indépendamment en regardant l'ID utilisateur du processus.
Asfand Qazi
Ce n'est pas utile si vous voulez le nom d'utilisateur plutôt que l'ID
Jonathan
3
si vous avez essayé la commande avant d'ajouter des commentaires faux, vous verriez que l' -nargument affiche le nom d'utilisateur, tout comme la question d'origine posée. voir ce qui suit: id -u -nimpressions brett- même sur darwin.
Brett
20

Utilisez la commande standard Unix / Linux / BSD / MacOS lognamepour récupérer l'utilisateur connecté. Cela ignore l'environnement ainsi que sudo, car ce sont des journalistes peu fiables. Il imprimera toujours le nom de l'utilisateur connecté, puis quittera. Cette commande existe depuis environ 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
la source
17

Un hack que j'ai utilisé sur Solaris 9 et Linux et qui fonctionne bien pour les deux:

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

Cet extrait de code imprime le nom de l'utilisateur avec l'EUID actuel.

REMARQUE: vous avez besoin de Bash comme interprète ici.

Sous Solaris, vous avez des problèmes avec les méthodes décrites ci-dessus:

  • idn'accepte pas les paramètres -uet -n(vous devrez donc analyser la sortie)
  • whoami n'existe pas (par défaut)
  • who am I imprime le propriétaire du terminal actuel (ignore EUID)
  • $USERla variable n'est définie correctement qu'après avoir lu les fichiers de profil (par exemple, /etc/profile)
Elvenfighter
la source
1
Pourquoi avez-vous besoin de bash comme interprète? Rien dans la ligne de commande affichée ne semble être spécifique à un shell. En fait, pourquoi même inclure le tuyau dans awk? Pour autant que je sache, votre pscommande est tout ce qui est nécessaire pour afficher le propriétaire du pid du shell actuel.
ghoti
Pour nous en tant qu'êtres humains, ignorer les informations superflues est naturel. La partie awk isole les données souhaitées - pour les variables ou en général l'ordinateur qui ne peut pas encore faire d'hypothèses à la volée à ce niveau rudimentaire.
BradChesney79
Sous Solaris, utilisez command -p id(à partir d'un shell POSIX) ou /usr/xpg4/bin/id. Plus généralement, sur Solaris, vous voudriez modifier votre environnement pour vous mettre dans un environnement POSIX (avec quelque chose comme PATH=getconf PATH` et assurez-vous de courir /usr/xpg4/bin/sh) pour éviter d'être coincé avec des commandes des années 70/80.
Stéphane Chazelas
'ps: option inconnue - o'
Anand Rockzz
12

Deux commandes:

  1. id imprime l'ID utilisateur avec les groupes. Format:uid=usernumber(username) ...

  2. whoami donne le nom d'utilisateur actuel

Sireesh Yarlagadda
la source
1
$ whoami n'est pas disponible en tant que variable dans bash. Vous devez faire $ (whoami) ou `whoami` pour exécuter la commande whoami!
Rudolf Mayer
@RudolfMayer Je l'ai corrigé
wjandrea
6

Lorsque les autorisations root (sudo) sont requises, ce qui est généralement de 90% + lors de l'utilisation de scripts, les méthodes des réponses précédentes vous donnent toujours root la réponse.

Pour obtenir l'utilisateur "connecté" actuel est tout aussi simple, mais cela nécessite d'accéder à différentes variables: $SUDO_UIDet$SUDO_USER .

Ils peuvent être repris:

echo $SUDO_UID
echo $SUDO_USER

Ou attribué, par exemple:

myuid=$SUDO_UID
myuname=$SUDO_USER
OldManRiver
la source
6

Dans Solaris OS, j'ai utilisé cette commande:

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

Sous Linux - Quelqu'un a déjà répondu à cela dans les commentaires.

$ whoami       # Without space
Lin-man
la source
5

Pour Bash , KornShell ( ksh), shetc. Beaucoup de vos questions trouvent rapidement une réponse:

man [function]

pour obtenir la documentation du système que vous utilisez ou généralement plus facilement:

google "fonction homme"

Cela peut donner des résultats différents pour certaines choses où Linux et Unix ont des différences modestes.

Pour cette question, entrez simplement "whoami" dans votre coquille.

Pour l'écrire:

myvar=$(whoami)
Fred Mitchell
la source
2

Le nom d'utilisateur de l'utilisateur actuel peut être obtenu en Bash pur avec l' ${parameter@operator}extension de paramètre (introduite dans Bash 4.4):

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

La fonction :intégrée (synonyme de true) est utilisée à la place d'une variable temporaire en définissant le dernier argument, qui est stocké dans $_. Nous développons ensuite it ( \u) comme s'il s'agissait d'une chaîne d'invite avec l' Popérateur.

C'est mieux que d'utiliser $USER, comme $USERc'est juste une variable environnementale régulière; elle peut être modifiée, non définie, etc. Même si elle n'est pas intentionnellement altérée, un cas courant où elle est toujours incorrecte est lorsque l'utilisateur est changé sans démarrer un shell de connexion ( supar défaut).

Crestwave
la source
1

Sur la plupart des systèmes Linux, il suffit de taper whoami sur la ligne de commande pour fournir l'ID utilisateur.

Cependant, sur Solaris, vous devrez peut-être déterminer l'ID utilisateur, en déterminant l'UID de l'utilisateur connecté via la commande ci-dessous.

echo $UID

Une fois l'UID connu, recherchez l'utilisateur en faisant correspondre l'UID au /etc/passwdfichier.

cat /etc/passwd | cut -d":" -f1,3
John
la source
chat / etc / passwd | cut -d ":" -f1,3 | grep $ UID | cut -d ":" -f1
Andrew Taylor Il y a
-4

Récupère le user_struct de la tâche en cours

#define get_current_user()              \
({                                      \
    struct user_struct *__u;            \
    const struct cred *__cred;          \
    __cred = current_cred();            \
    __u = get_uid(__cred->user);        \
    __u;                                \
})
insensé
la source
2
La question était de savoir comment obtenir le nom d'utilisateur dans un script bash. Cette réponse est sur la façon d'obtenir l'ID utilisateur numérique (pas le nom d'utilisateur) à partir du code C exécuté à l'intérieur du noyau Linux (comme à partir d'un module de noyau Linux personnalisé). Ce n'est pas une réponse à la question qui a été posée, c'est une réponse à une autre question.
Simon Kissane