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:

  1. The visual reminder that you are in a 'root' session.
  2. 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.