“su”、“sudo -s”、“sudo -i”、“sudo su”之间有什么区别?

Smi*_*ter 171 sudo su

我已经从手册中阅读了它,但我看不出有什么区别..

su - 更改用户 ID 或成为超级用户

sudo -s [command]
Run Code Online (Sandbox Code Playgroud)

-s(壳)选项运行由SHELL环境变量指定的壳,如果它是一组或如passwd的(5)中规定的壳。如果指定了命令,则将其传递给 shell 执行。否则,将执行交互式 shell。

sudo -i 消失手册中的描述

Ser*_*gey 135

这些命令之间的主要区别在于它们限制对其功能的访问的方式。

su (这意味着“替换用户”或“切换用户”) - 正是这样做的,它启动另一个具有目标用户权限的 shell 实例。为确保您有权这样做,它会要求您提供目标用户的密码。因此,要成为 root,您需要知道 root 密码。如果您的机器上有多个用户需要以 root 身份运行命令,他们都需要知道 root 密码 - 请注意,这将是相同的密码。如果您需要撤消其中一位用户的管理员权限,则需要更改 root 密码并将其仅告诉那些需要保持访问权限的人 - 混乱。

sudo (嗯...助记符是什么?超级用户-DO?)完全不同。它使用一个配置文件 (/etc/sudoers),其中列出了哪些用户有权执行特定操作(以 root 身份运行命令等)。在调用时,它会询问启动它的用户的密码 - 以确保该人在终端实际上​​就是/etc/sudoers. 要撤销一个人的管理员权限,您只需要编辑配置文件(或从该配置中列出的组中删除用户)。这会导致更清晰的权限管理。

因此,在许多基于 Debian 的系统中,root用户没有设置密码——即无法直接以 root 身份登录。

此外,/etc/sudoers允许指定一些附加选项 - 即用户 X 只能运行程序 Y 等。

经常使用的sudo su组合的工作原理如下:首先sudo请你为你的密码,并且,如果你允许这样做,调用一个命令(su)作为超级用户。由于su由 调用root,因此不需要您输入目标用户的密码。因此,如果文件sudo su允许您具有超级用户访问权限,则允许您以另一个用户(包括 root 用户)身份打开 shell /etc/sudoers

  • “su”的官方含义是“替代用户”。参见:“曼苏”。 (15认同)
  • @jimbob 博士:你说得对,但我发现“切换用户”更好地描述了它的作用 - 尽管在历史上它代表“超级用户”。我也很高兴地发现维基百科的文章与我的回答非常相似——我以前从未看过这篇文章:) (7认同)
  • 我从未将 `su` 视为“切换用户”,但总是作为超级用户;没有其他用户名的默认行为(尽管它是有道理的)。来自 [wikipedia](http://en.wikipedia.org/wiki/Su_(Unix)) :“su 命令,早在 1974 年也被称为超级用户 [1],也被称为“替代用户” 、“欺骗用户”或“设置用户”,因为它允许更改与当前终端(窗口)关联的帐户。” (3认同)
  • @AngelO'Sphere:有趣的是,Ubuntu 的联机帮助页根本没有提到“替代”。gnu.org (http://www.gnu.org/software/coreutils/manual/html_node/su-invocation.html) 的联机帮助页确实说“su:使用替代用户和组 ID 运行命令”。我认为 gnu.org 是一个规范的来源:) (2认同)
  • 那“sudo su”呢? (2认同)
  • 根环境的初始化方式存在细微差别,其他答案中讨论了一些细节。通常这些差异并不重要。 (2认同)

Mik*_*ott 69

sudo允许您使用 root 权限在自己的用户帐户中运行命令。su允许您切换用户,以便您实际以 root 身份登录。

sudo -s运行具有 root 权限的 shell。sudo -i还获取root用户的环境。

要看到的区别susudo -s,做cd ~pwd后他们每个人。在第一种情况下,您将位于 root 的主目录中,因为您是 root。在第二种情况下,您将位于自己的主目录中,因为您自己拥有 root 权限。

有这个确切的问题进行更多的讨论在这里

  • “你自己拥有 root 权限”并不是实际发生的事情:) 实际上,“你自己拥有 root 权限”是不可能的——要么你是 root,要么就是你自己。尝试在这两种情况下输入 **whoami**。`cd ~` 结果不同的事实是 sudo -s 没有设置 $HOME 环境变量的结果。 (26认同)
  • 关于“根据 sudoers 文件,您可能仍然没有完全的 root 访问权限”:`sudoers` 文件控制谁可以作为另一个用户运行哪个命令,但这发生在命令执行之前。但是,一旦您被允许以 root 身份启动进程 - 正在运行的进程具有 root 的 UID 并且对系统具有完全访问权限,则 sudo 无法对其进行限制。同样,您始终是您自己或 root,没有“一半 n 一半”。因此,如果 `sudoers` 文件允许您以 root 身份运行 shell - 该 shell 中的权限将与“普通”root shell 没有区别。 (5认同)
  • @Sergey,它说 whoami 是“root”,因为您正在运行“whoami”cmd,就像您使用了 sudo 一样,所以暂时(在该命令的持续时间内)您似乎是 root 用户,但您可能仍然没有完整的权限根据 sudoers 文件进行 root 访问。 (2认同)

dot*_*hen 47

这个答案是我对这个问题的回答的欺骗,放在规范的答案上,以便人们可以找到它!

sudo -i和之间的主要区别sudo -s是:

  • sudo -i为您提供根环境,即您的~/.bashrc被忽略。
  • sudo -s给你用户的环境,所以你~/.bashrc的受到尊重。

下面是一个例子,你可以看到,我有一个应用程序lsl在我的~/.bin/目录是通过访问sudo -s而与访问sudo -i。另请注意,Bash 提示会随 一起更改,sudo -i但不随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
Run Code Online (Sandbox Code Playgroud)

虽然sudo -s方便给你熟悉的环境,但我推荐使用的sudo -i原因有两个:

  1. 您处于“root”会话中的视觉提醒。
  2. 根环境被恶意软件毒害的可能性要小得多,例如.bashrc.


Mar*_*nas 10

su 要求输入用户“root”的密码。

sudo询问您自己的密码(并检查您是否可以以 root 身份运行命令,这是通过配置的/etc/sudoers——默认情况下,所有属于“admin”或“sudo”组的用户帐户都允许使用 sudo)。

sudo -s以 root 身份启动 shell,但不会更改您的工作目录。 sudo -i模拟登录到 root 帐户:您的工作目录将是/root,root.profile等将在登录时获取。


Rav*_*ina 8

  • su 询问 root 密码,成为 root,打开一个交互式非登录 shell。
  • su - 询问 root 密码,成为 root,打开一个交互式登录 shell。

  • sudo -s 询问您的密码,成为 root,打开一个交互式非登录 shell。
  • sudo -i 询问您的密码,成为 root,打开交互式登录 shell。

最佳实践是使用这两个。


  • sudo su询问您的密码,成为 root 用户并以 root 用户身份运行su
  • sudo su -询问您的密码,成为 root 用户并su -以 root 用户身份运行。

因此,在这种情况下,您正在su使用sudo并且不必知道 root 的实际密码。结果与su和相同su -

  • 登录 shell 和非登录 shell 有什么区别? (4认同)
  • [另一个问题?](https://unix.stackexchange.com/questions/38175/difference- Between-login-shell-and-non-login-shell) (4认同)