Identifier l'utilisateur dans un script Bash appelé par sudo

108

Si je crée le script /root/bin/whoami.shcontenant:

#!/bin/bash
whoami

et ce script est appelé par un utilisateur avec un sudo correctement configuré, il indiquera

root

Existe-t-il un moyen rapide d'obtenir l'utilisateur réel dans un script, ou devrai-je recourir à des paramètres transmettant ce nom d'utilisateur?

quadmore
la source

Réponses:

134

$ SUDO_USER ne fonctionne pas si vous utilisez sudo su -.
Il nécessite également plusieurs vérifications - si $USER == 'root'alors obtenez $SUDO_USER.

Au lieu de la commande, whoamiutilisez who am i. Cela exécute la whocommande filtrée pour la session en cours. Il vous donne plus d'informations que nécessaire. Alors, faites ceci pour obtenir uniquement l'utilisateur:

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

Alternativement (et plus simple), vous pouvez utiliser logname. Il fait la même chose que la déclaration ci-dessus.

Cela vous donne le nom d'utilisateur qui s'est connecté à la session.

Ceux-ci fonctionnent indépendamment de sudoou sudo su [whatever]. Cela fonctionne également quel que soit le nombre de fois suet sudosont appelés.

Evan
la source
2
Oui, +1, who am iest la réponse ici.
Joe Kearney
43
Alternative à who am iest who mom likes. Votre choix.
wchargin
3
whorenvoie 2 lignes pour moi, contenant toutes les deux mon nom, et who am in'en renvoie aucune. De l'aide?
Hosh Sadiq
7
Je suis sur Ubuntu 16.04 et la commande who am ine fait rien, cela semble être simple who, donc who | awk '{print $1}'fonctionne comme prévu;)
daveoncode
1
Juste au cas où vous n'avez pas awkinstallé, vous pouvez également utiliser cut: who mom likes | cut -d' ' -f1 ou sedpour une raison quelconque: who mom likes | sed -n 's/^\([^ ]*\).*/\1/p'
Yzmir Ramirez
56

Je pense que $ SUDO_USER est valide.

#!/bin/bash
echo $SUDO_USER
whoami
Brandon Horsley
la source
1
Chose étrange: sudo envmontre SUDO_USERmais sudo echo $SUDO_USERn'imprime rien ...
Job
17
travail, ce n'est pas étrange, c'est attendu. dans sudo echo $SUDO_USER, bash évalue $ SUDO_USER avant d' exécuter sudo. essayez le script publié dans cette solution, cela fonctionne.
@quadmore: Si vous êtes satisfait de la réponse, n'oubliez pas de l'accepter.
Emploi du
2
Vous pouvez également utiliser echo ${SUDO_USER:-$USER}pour attraper à la fois sudoet non-sudo en cours d'exécution. Mais la réponse d'Evan logname semble plus facile
Tobias Kienzler
2
@TobiasKienzler - Et comme evan le souligne, $SUDO_USERne fonctionne pas avec sudo su -, mais lognamefonctionne toujours.
David Harkness
13

Voici comment obtenir le nom d'utilisateur de la personne qui a appelé le script, que sudo ou non:

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

ou une version plus courte

[ $SUDO_USER ] && user=$SUDO_USER || user=`whoami`
Alexei Tenitski
la source
8
encore plus court: user=${SUDO_USER:-$(whoami)}ouuser=$(logname)
Tobias Kienzler
3

who am i | awk '{print $1}'n'a pas fonctionné pour moi mais who|awk '{print $1}'servira le travail

Srinivas
la source
1
Pas sur un hôte où plusieurs utilisateurs ont une session
Roman Grazhdan
1

En utilisant whoami, who am i, who, idou $SUDO_USERn'est pas ici.

En fait, ce whon'est jamais une solution à la question, car il ne listera que les utilisateurs connectés, qui peuvent être des dizaines ...

À mes yeux, la seule réponse valable est l'utilisation de logname.

J'espère que cela t'aides

Rob

Rob
la source
0

Si c'est l'UID que vous recherchez (utile pour les manigances de docker), alors cela fonctionne:

LOCAL_USER_ID=$(id -u $(logname))
Jim Hunziker
la source