sudo as another user with their environment
To invoke a login shell using sudo
just use -i
. When command is not specified you'll get a login shell prompt, otherwise you'll get the output of your command.
Example (login shell):
sudo -i
Example (with a specified user):
sudo -i -u user
Example (with a command):
sudo -i -u user whoami
Example (print user's $HOME
):
sudo -i -u user echo \$HOME
Note: The backslash character ensures that the dollar sign reaches the target user's shell and is not interpreted in the calling user's shell.
I have just checked the last example with strace which tells you exactly what's happening. The output bellow shows that the shell is being called with --login
and with the specified command, just as in your explicit call to bash, but in addition sudo can do its own work like setting the $HOME
.
# strace -f -e process sudo -S -i -u user echo \$HOME
execve("/usr/bin/sudo", ["sudo", "-S", "-i", "-u", "user", "echo", "$HOME"], [/* 42 vars */]) = 0
...
[pid 12270] execve("/bin/bash", ["-bash", "--login", "-c", "echo \\$HOME"], [/* 16 vars */]) = 0
...
I noticed that you are using -S
and I don't think it is generally a good technique. If you want to run commands as a different user without performing authentication from the keyboard, you might want to use SSH instead. It works for localhost
as well as for other hosts and provides public key authentication that works without any interactive input.
ssh user@localhost echo \$HOME
Note: You don't need any special options with SSH as the SSH server always creates a login shell to be accessed by the SSH client.
You're giving Bash too much credit. All "login shell" means to Bash is what files are sourced at startup and shutdown. The $HOME
variable doesn't figure into it.
The Bash docs explain some more what login shell means: https://www.gnu.org/software/bash/manual/html_node/Bash-Startup-Files.html#Bash-Startup-Files
In fact, Bash doesn't do anything to set $HOME
at all. $HOME
is set by whatever invokes the shell (login, ssh, etc.), and the shell inherits it. Whatever started your shell as admin set $HOME
and then exec-ed bash
, sudo
by design doesn't alter the environment unless asked or configured to do so, so bash
as otheruser inherited it from your shell.
If you want sudo
to handle more of the environment in the way you're expecting, look at the -i
switch for sudo. Try:
sudo -S -u otheruser -i /bin/bash -l -c 'echo $HOME'
The man page for sudo describes it in more detail, though not really well, I think: http://linux.die.net/man/8/sudo