What is the difference between "sudo -i" and "sudo bash -l"

There is a recent question regarding multiple sysadmins working as root, and sudo bash -l was referenced.

I searched for this on google and SE, but I don't understand the difference between sudo bash -l and sudo -i.

From the man pages for bash and sudo it seems that the difference may be that sudo bash -l runs ~/.bash_profile, ~/.bash_login, and ~/.profile, and ~/.bash_logout of the root user, but from testing myself it looks like it runs the normal user's .bashrc and not the root one. I may have misunderstood which user the ~ expression is referencing in the man pages. Clarification of the difference and usage scenarios would be appreciated.


Solution 1:

They differ in that if the root user login shell specified in /etc/passwd is not bash, then the second command will get you a bash shell as root while the first command will use whatever the interactive shell the root user has.

Solution 2:

Also to add to @johnshen64 answer I noticed that the sudo -i invocation updates the $USERNAME env variable to root and cd ~ to the user home like so;

$ sudo -i
[root@workstation001 ~]# id
uid=0(root) gid=0(root) groups=0(root)
[root@workstation001 ~]# echo $USERNAME
root
[root@workstation001 userXXX]# echo $PWD
/root

However for sudo bash -l $USERNAME is unmolested, and the working directory is not changed. (though this is not consistent across other users, see comments...)

$ sudo bash -l
[root@workstation001 userXXX]# id
uid=0(root) gid=0(root) groups=0(root)
[root@workstation001 userXXX]# echo $USERNAME
userXXX
[root@workstation001 userXXX]# echo $PWD
/home/userXXX

So presumably you are not getting exactly the same set of ~/.bashrc, or not in the same order etc.

(my box might have been messed up a little by my .bashrc tinkerings, so YMMV)