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?


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

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.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.