47

How do I get the correct $USER if I run a shell script with sudo ?

I run them as postinstall scripts in a Mac install package, where they are being sudo-ed automatically, but I need to do stuff with the username.

$HOME is correct, though. The inelegant method would be to extract the name from the home path, but I wonder if there is a natural way to do this.

I can't influence the way the scripts are being called, as it's an automatic call inside the installer.

4 Answers 4

46

On my system the variable $SUDO_USER is set to the caller's user name.

You shouldn't extract the username from the ${HOME} variable directly. It's being configured and not calculated. To Extract the username you could take a look into /etc/passwd file, but this is very system dependent, e.g. sometimes you have to look into a LDAP directory or the entries are propagated through NIS ...

Sign up to request clarification or add additional context in comments.

2 Comments

For those landing here because gnome-terminal dropped support for logname, this seems to work well $(logname 2>/dev/null || echo $SUDO_USER). Tested on MacOS too. Bug report: bugzilla.gnome.org/show_bug.cgi?id=747046
logname 2>/dev/null || echo $SUDO_USER , command worked for me in the OS Ubuntu 16.04.6 LTS and Ubuntu 20.04 LTS.
29

You can use $(logname), which returns your login name even if you are currently sudoing.

3 Comments

@Knetic for future you and other Googlers, it may not: bugzilla.gnome.org/show_bug.cgi?id=747046
It is returning sudo name on Ubuntu 16.04.1 LTS
On Arch Linux I suggest using echo $LOGNAME... But it depends on your environment variables
19

Inspect the variable SUDO_USER.

http://www.gratisoft.us/sudo/man/sudo.html#environment

Another way to get the user is via the who command. This is useful sometimes when you don't care if the user has sudo'd or not.

who -m | awk '{print $1;}'

Comments

9

SUDO_USER isn't portable. It's unset on Fedora 17.

The $USER and $UID variables aren't predictable when invoking sudo either. Some distros report the sudoer, others report the root user.

It's by no means perfect, but you could use test -w ~root && echo I have write access to ~root.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.