“sudo -i”和“sudo bash -l”有什么区别

Rqo*_*mey 13 linux bash root sudo

最近有一个关于多个系统管理员以 root 身份工作的问题sudo bash -l并被引用。

我搜索了这对谷歌和SE,但我不明白之间的差别sudo bash -lsudo -i

从 bash 和 sudo 的手册页看来,不同之处可能在于sudo bash -l运行 root 用户的 ~/.bash_profile、~/.bash_login 和 ~/.profile 以及 ~/.bash_logout,但从我自己的测试来看,它看起来像它运行普通用户的 .bashrc 而不是根用户。我可能误解了 ~ 表达式在手册页中引用了哪个用户。对差异和使用场景的澄清将不胜感激。

joh*_*n64 10

它们的不同之处在于,如果 /etc/passwd 中指定的 root 用户登录 shell 不是 bash,那么第二个命令将以 root 身份获取 bash shell,而第一个命令将使用 root 用户拥有的任何交互式 shell。

  • 人们喜欢他们使用的shell,所以如果你想确保使用bash,那么应该使用第二种形式。第二种形式也模拟实际登录(这就是 -l 的意思)。当然,当您发现用户(默认为 root)在使用 sudo -i 时没有将 bash 作为交互式 shell 时,您也可以只输入 bash。否则差异很小。正如另一个答案所示,也存在一些细微的环境差异。在大多数情况下,差异无关紧要,第一个更短,因为大多数常见发行版使用 bash。我很少使用第二种形式。 (2认同)

Tom*_*Tom 5

另外,为了添加到 @johnshen64 答案,我注意到调用将env 变量sudo -i更新到用户主目录,如下所示;$USERNAMErootcd ~

$ 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
Run Code Online (Sandbox Code Playgroud)

但是 forsudo bash -l $USERNAME没有受到干扰,并且工作目录也没有更改。(尽管这与其他用户不一致,请参阅评论......)

$ 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
Run Code Online (Sandbox Code Playgroud)

所以想必您没有得到完全相同的一组~/.bashrc,或者顺序不同等。

(我的盒子可能因为我的修补而弄乱了一点.bashrc,所以 YMMV)