It seems when sudoing down that using sudo -u $user that the environment of root is still being used. How can I make sudo use the users environment? as a special note not all users that I will be using this on have login shells.

  • Define 'environment'. # whoami => root # sudo -u user whoami => user
    – alex
    Nov 26, 2010 at 6:54
  • 1
    @alex I figure sudo -u user is analogous to su user to switch the env in su you have to use su - user Nov 26, 2010 at 8:16
  • But what do you mean with "the user's environment" if the user doesn't have a login shell? Nov 26, 2010 at 12:07
  • @Thomas users can run programs even if they can't shell in... I believe -u also ignores groups... I tried something from root (using sudo -u down) and it worked, apparently it didn't for the user... so I have to make sure I'm running commands in a way that would have all there limitations and environmental issues. Nov 26, 2010 at 15:29

3 Answers 3


Try sudo -i -u $user

gerald@book:~$ env |grep HOME
gerald@book:~$ sudo -u ubuntu env |grep HOME
gerald@book:~$ sudo -i -u ubuntu env |grep HOME
  • unfortunately doesn't work if they don't have a shell in /etc/passwd :( but it'll do I guess... Dec 3, 2010 at 10:39
  • Looking at the man page, it seems that -E is the one that preserves the environment, i.e. all the environment variables etc are there, although it still doesn't set PATH and LD_LIBRARY_PATH to the calling user's.
    – Shahbaz
    Jun 17, 2013 at 15:22
  • 1
    $SUDO_USER can be used Oct 26, 2015 at 8:42
  • Do you know if there is any way to prevent the command from being run from the user's home directory instead of the current directory?
    – pooya13
    Jun 9, 2021 at 5:51

man sudoers on Debian mentions another possibility. Not sure which way around you want, but your question sounds like you would want to have the env_reset option from /etc/sudoers - the opposite is basically the env_keep list. In order to set the proper HOME you can use the -H option to sudo directly or, again in sudoers, with the always_set_home option.

Alternatively you could use env_file to specify an exact environment you want to pass. However, I think it is best if you check out the env_* options from man sudoers, because /etc/sudoers controls it all and that's the point to turn to.

Here's part of the context in which I use env_reset inside my sudoers file:

Defaults        !lecture
Defaults        env_reset
Defaults        syslog=auth
Defaults        log_year

When sudoing environment variables are not preserved.

In my case, I use here-document.

You put your actions such as my_script.sh inside your HERE DOCUMENT :

su -u some_user <<EOF

You should not put variable directly here, as they would be interpreted from your current user.

su -u some_user <<EOF
./my_script.sh $MY_VAR

If $MY_VAR is not set for the user running the script, it won't be set.

You variable must be called inside your scripts, or you must escape them with \.


su -u some_user <<EOF
./my_script.sh \$MY_VAR

Here, $MY_VAR will have some_user contextual value.

  • Good answer. One small correction: It should be su - some_user instead of su -u some_user. Jun 25, 2019 at 6:30

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .