Comment obtenir le nom de l'utilisateur qui a exécuté un script bash en tant que sudo?

17

Je veux créer un script bash qui doit être exécuté avec sudo mais doit prendre en compte le nom de l'utilisateur non sudo qui l'a exécuté. Donc, si l'utilisateur bobs'exécute, sudo ./myscript.shje voudrais myscript.shsavoir si bobc'est lui qui l'a exécuté.

Regardons à l'intérieur myscript.sh:

USER=$(whoami)
# Do something that takes into account the username.

Comment puis-je connaître le nom de l'utilisateur qui a engendré le processus? Plus précisément, que dois-je utiliser au lieu de whoamipour obtenir bobet non root?

marcio
la source
Ce n'est pas un script valide, je pense que vous vouliez dire USER=$(whoami). Notez que le USERexiste déjà en tant que variable interne du shell. De plus, s'il s'agit d'un script bash, ne l' exécutez pas à l'aide sh, qui ne possède qu'un sous-ensemble de fonctionnalités compatibles POSIX.
nyuszika7h
pourquoi ne pas éditer? réparé maintenant.
marcio
C'est trop trivial, les modifications doivent comporter au moins 6 caractères, au moins ceux suggérés.
nyuszika7h
OK, je comprends. Merci pour les conseils: DI met généralement un hashbang comme celui-ci #!/usr/bin/env bashsur mes scripts bash.
marcio
Le hashbang est ignoré si vous l'appelez explicitement avec shou autre chose.
nyuszika7h

Réponses:

28

Je ne sais pas à quel point c'est standard, mais au moins dans les systèmes Ubuntu sudodéfinit les variables d'environnement suivantes (entre autres - voir la ENVIRONMENTsection de la page de manuel sudo):

   SUDO_UID        Set to the user ID of the user who invoked sudo

   SUDO_USER       Set to the login of the user who invoked sudo

par exemple,

steeldriver@lap-t61p:~$ sudo sh -c 'whoami'
root
steeldriver@lap-t61p:~$ sudo sh -c 'echo $SUDO_USER'
steeldriver
tournevis
la source
Fonctionne comme prévu sur toutes les plateformes que j'ai testées: debian, fedora (redhat) et freebsd. Merci!
marcio
Confirmé de travailler sur un Mac.
SiKing
Fonctionne également sur Ubuntu.
Andi Jay
9

Si vous souhaitez que cela fonctionne sudoégalement, utilisez ${SUDO_USER:-$USER}. Par exemple:

printf '%s\n' "${SUDO_USER:-$USER}"

Explication

${var:-val}s’étendra à $varmoins qu’il ne soit pas défini ou vide, auquel cas il s’étendra val.

nyuszika7h
la source