How to get the name of the user who executed a bash script as sudo?

23,031

Solution 1

I'm not sure how standard it is, but at least in Ubuntu systems sudo sets the following environment variables (among others - see the ENVIRONMENT section of the sudo manpage):

   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

for example,

steeldriver@lap-t61p:~$ sudo sh -c 'whoami'
root
steeldriver@lap-t61p:~$ sudo sh -c 'echo $SUDO_USER'
steeldriver

Solution 2

If you want it to work without sudo as well, use ${SUDO_USER:-$USER}. For example:

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

Explanation

${var:-val} will expand to $var, unless it's unset or empty, in which case it will expand to val.

Share:
23,031

Related videos on Youtube

marcio
Author by

marcio

Contributor of many open source projects. Languages I work with: PHP Go Python Lisp Rebol and Red C (learning) C++ (learning)

Updated on September 18, 2022

Comments

  • marcio
    marcio over 1 year

    I want to create a bash script that must be executed with sudo but should take into account the name of the non-sudo user who executed it. So if user bob runs sudo ./myscript.sh I would like myscript.sh to know bob was the one who executed it.

    Let's look inside myscript.sh:

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

    How can I know the name of the user who spawned the process? More specifically, what should I use instead of whoami to get bob and not root?

  • marcio
    marcio almost 10 years
    Works as expected on all platforms I tested: debian, fedora(redhat) and freebsd. Thanks!
  • SiKing
    SiKing almost 8 years
    Confirmed working on a Mac.