sudo su -与sudo -i

sudo su -与sudo -i

要在禁用 root 帐户的计算机上启动 root shell,您可以运行以下命令之一:

  • sudo -i:运行交互式登录 shell(读取/root/.bashrc/root/.profile
  • sudo -s:运行非登录交互式 shell(读取/root/.bashrc

在 Ubuntu 世界中,我经常看到sudo su建议作为获取 root shell 的方法。既然一个命令就可以,为什么还要运行两个单独的命令呢?据我所知,sudo -i相当于 且sudo su -sudo -s相同sudo su

唯一的区别似乎是(比较sudo -i左侧和sudo su -右侧):

meld 比较“sudo -i”和“sudo su -”的屏幕截图

比较sudo -s(左)和sudo su(右):

meld 比较“sudo -s”和“sudo su”的屏幕截图

主要区别(忽略SUDO_foo变量 和LS_COLORS)似乎是版本XDG_foo中的系统变量sudo su

是否存在这种差异需要使用相当不优雅的情况sudo su?我可以安全地告诉人们(就像我经常做的那样)跑步没有任何意义sudo su,还是我错过了什么?

答案1

正如您在问题中所说,主要区别在于环境。

sudo su -sudo -i

如果sudo su -它是登录 shell,则执行/etc/profile、和 ,您将发现自己位于 root 的主目录中,并且具有 root 的环境。.profile.bashrc

sudo -isudo su -与(模拟初始登录)选项几乎相同,-i将目标用户的密码数据库条目指定的 shell 作为登录 shell 运行。这意味着特定于登录的资源文件(例如.profile.bashrc或 ).login将由 shell 读取并执行。

sudo susudo -s

sudo susudo用命令调用su。 Bash 被称为交互式非登录 shell。所以bash只执行.bashrc.可以看到切换到root后仍然在同一个目录中:

user@host:~$ sudo su
root@host:/home/user#

sudo -s读取$SHELL变量并执行内容。如果$SHELL包含/bin/bash它会调用sudo /bin/bash,这意味着它/bin/bash作为非登录 shell 启动,因此所有点文件都不会执行,但bash它本身会读取 。bashrc呼叫用户的。您的环境保持不变。你的家不会是 root 的家。所以你是 root,但是处于调用用户的环境中。

结论

-i标志已添加sudo2004年,提供与 类似的功能sudo su -sudo su -模板也是如此sudo -i,并且意味着像它一样工作。我认为使用哪个并不重要,除非环境不重要。

添加

这里必须提到的一个基本点是它sudo被设计为仅运行一个命令具有更高的权限,然后将这些权限降低到原始权限。它从来都不是为了真正转变用户并保持打开 root shell。随着时间的推移,这种机制得到了扩展,因为人们对为什么要在每个命令前面sudo使用感到恼火。sudo

所以这个词的意思sudo就被滥用了。sudo旨在鼓励用户尽量减少使用 root 权限。

我们现在所拥有的,正sudo变得越来越流行。它几乎集成在每个知名的 Linux 发行版中。切换到另一个用户帐户的原始工具是su。对于一个老派的 *nix 老手来说,这样的事情sudo似乎没有必要。它增加了复杂性,并且行为更类似于我们从 Microsoft 操作系统系列中了解到的机制,因此与 *nix 系统的简单性理念背道而驰。

我并不是真正的老手,但在我看来,sudo从引入它起,它一直是我的眼中钉,sudo如果可能的话,我总是围绕 的用法进行工作。我最不愿意用sudo。在我的所有系统上,root 帐户均已启用。但事情会发生变化,也许有一天su会被弃用并被完全sudo取代。su

因此我认为,最好使用sudo内部机制(-s-i)而不是依赖于旧工具,例如su.

答案2

直接回答你的问题:不,没有充分的理由这样做。另外,当一个日志条目就足够时,sudo su 会生成两个日志条目。

我见过很多人这样做,当我问他们为什么不直接运行时sudo -s,答案是他们不知道-ssudo 的标志,通常他们会在我指出后切换。

但是,在您的sudo -s和列表中sudo -i,我想再添加一个选项 ,sudo -sE它是 的替代品su -msudo -sE保留您的环境,包括主目录。如果您的主目录不安全(在 NFS 上),这会存在风险。但在很多人使用 root 的环境中,它使您不必就 root 文件的内容达成一致.bashrc。我的.bashrc包含许多 root 的专业化,所以我没有得到与 root 完全相同的环境,但至少我得到了我想要的环境。

相关内容