What is the difference between sudo -i and sudo -s? [duplicate]
Solution 1:
The major difference between sudo -i
and sudo -s
is:
-
sudo -i
gives you the root environment, i.e. your~/.bashrc
is ignored. -
sudo -s
gives you the user's environment, so your~/.bashrc
is respected.
Here is an example, you can see that I have an application lsl
in my ~/.bin/
directory which is accessible via sudo -s
but not accessible with sudo -i
. Note also that the Bash prompt changes as will with sudo -i
but not with sudo -s
:
dotancohen@melancholy:~$ ls .bin
lsl
dotancohen@melancholy:~$ which lsl
/home/dotancohen/.bin/lsl
dotancohen@melancholy:~$ sudo -i
root@melancholy:~# which lsl
root@melancholy:~# exit
logout
dotancohen@melancholy:~$ sudo -s
Sourced .bashrc
dotancohen@melancholy:~$ which lsl
/home/dotancohen/.bin/lsl
dotancohen@melancholy:~$ exit
exit
Though sudo -s
is convenient for giving you the environment that you are familiar with, I recommend the use of sudo -i
for two reasons:
- The visual reminder that you are in a 'root' session.
- The root environment is far less likely to be poisoned with malware, such as a rogue line in
.bashrc
.
Solution 2:
sudo -i
-i [command] The -i (simulate initial login) option runs the shell speci‐ fied by the password database entry of the target user as a login shell. This means that login-specific resource files such as .profile or .login will be read by the shell. If a command is specified, it is passed to the shell for execution via the shell's -c option. If no command is specified, an interactive shell is executed. sudo attempts to change to that user's home directory before running the shell. The security policy shall initialize the environment to a minimal set of variables, similar to what is present when a user logs in. The Command Environment section in the sudoers(5) manual documents how the -i option affects the environment in which a command is run when the sudoers policy is in use.
sudo -s
-s [command] The -s (shell) option runs the shell specified by the SHELL environment variable if it is set or the shell as specified in the password database. If a command is specified, it is passed to the shell for execution via the shell's -c option. If no command is specified, an interactive shell is executed.