131 votes

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

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

#!/bin/bash
whoami

et que 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 vais-je devoir recourir à des paramètres transmettant ce nom d'utilisateur ?

170voto

evan Points 4825

$SUDO_USER ne fonctionne pas si vous utilisez sudo su - .
Elle exige également des contrôles multiples - si $USER == 'root' puis obtenir $SUDO_USER .

Au lieu de la commande whoami utiliser who am i . Cela permet d'exécuter le who filtrée pour la session en cours. Cela vous donne plus d'informations que ce dont vous avez besoin. Donc, faites ceci pour obtenir seulement l'utilisateur :

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

Alternativement (et plus simplement) 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.

Ils fonctionnent indépendamment de sudo o sudo su [whatever] . Cela fonctionne également quel que soit le nombre de fois su y sudo sont appelés.

59 votes

Alternative à who am i es who mom likes . Vous avez le choix.

3 votes

who renvoie 2 lignes pour moi, contenant toutes deux mon nom, et who am i ne renvoie aucun résultat. Vous pouvez nous aider ?

0 votes

Je remarque que cela ne fonctionne pas dans un conteneur docker, car le who am i semble dépendre de la connexion et renvoie donc un message vide. Essayez docker run -it ubuntu bash y whoami donne l'utilisateur (Root dans ce cas, mais fonctionne correctement avec d'autres utilisateurs), alors que who am i est vide.

67voto

Brandon Horsley Points 4001

Je pense $SUDO_USER est valable.

#!/bin/bash
echo $SUDO_USER
whoami

4 votes

C'est étrange : sudo env montre SUDO_USER pero sudo echo $SUDO_USER n'imprime rien...

21 votes

Travail, ce n'est pas étrange, c'est attendu. en sudo echo $SUDO_USER , bash évalue $SUDO_USER avant exécuter sudo. essayer le script posté dans cette solution, il fonctionne.

0 votes

@quadmore : Si vous êtes satisfait de la réponse, n'oubliez pas de l'accepter.

15voto

Alexei Tenitski Points 2410

Voici comment obtenir le nom d'utilisateur de la personne qui a appelé le script peu importe si 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`

11 votes

Encore plus courte : user=${SUDO_USER:-$(whoami)} o user=$(logname)

1voto

msw Points 25319

Odd, le système fait la distinction entre des UID réels et effectifs mais je ne trouve aucun programme qui exporte cela au niveau du shell.

-4voto

frankc Points 6014

Essayez :
id -urn

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X