是否有充分的理由运行 sudo su?

ter*_*don 86 shell su sudo environment-variables

要在禁用 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 -ssudo 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还是我错过了什么?

cha*_*aos 70

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

sudo su - 对比 sudo -i

如果sudo su -它是一个登录 shell,那么/etc/profile,.profile.bashrc被执行,你会发现自己在 root 的主目录中,并且有 root 的环境。

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

sudo su 对比 sudo -s

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

user@host:~$ sudo su
root@host:/home/user#
Run Code Online (Sandbox Code Playgroud)

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.

  • 我之前从不知道 `sudo -i` 或 `sudo -s` - 自 1991 年以来我一直在运行各种 UNIX,对我来说 `sudo su -` 在这一点上只是一种根深蒂固的习惯。 (8认同)
  • 啊,那么在 2004 年之前,实际上有理由运行 `sudo su` 吗?当时我正在使用没有 sudo 和活动 root 帐户的发行版,所以我不知道。这可能解释了 sudo su meme 在 Ubuntu 世界中的流行。 (5认同)
  • (同意@chaos)使用`sudo su -` 的原因是1)它可以工作并且您确切地知道它的作用,以及2)您不必记住`sudo`的另一个选项(当您已经知道 `su -`) 和 3) 你不必记住你现在正在使用哪个版本的 `sudo`。当您已经拥有的工作正常时,为什么还要记住一件琐事?除了避免日志条目之外,还有什么可以让 `su -i` 做得更好的吗?我不会使用`sudo su -` 来担心这个。 (3认同)
  • 刚看到更新,不错!作为记录,让我声明我也在没有 `sudo` 的系统上削减了我的 *nix 牙齿,并且非常习惯于 `su`。正是这两者的结合让我感到困扰。 (3认同)
  • 那么`sudo -s` 和`sudo $SHELL` 是一样的吗? (2认同)

use*_*445 19

直接回答您的问题:不,没有充分的理由这样做。此外, sudo su 会在足够的情况下生成两个日志条目。

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

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

  • 如果它保留了您的环境,包括“$HOME”,则意味着在主文件夹下创建的所有新文件都归根用户所有,而不是归您所有。我已经遇到了许多难以诊断的权限错误。 (4认同)