Linux su vs sudo: 有什么区别?

非 root 用户提升权限的 Linux 命令比较。
12 位读者喜欢这篇文章。
bash logo on green background

Opensource.com

susudo 命令都允许用户执行非特权用户(即除 root 用户之外的所有人)不允许执行的系统管理任务。有些人更喜欢 sudo 命令:例如,Seth Kenlon 最近发表了“在 Linux 上使用 sudo 的 5 个理由”,其中他赞扬了 sudo 的许多优点。

另一方面,我偏爱 su 命令,并且在大多数系统管理工作中更喜欢它而不是 sudo。在本文中,我将比较这两个命令,并解释为什么我更喜欢 su 而不是 sudo,但仍然两者都使用。

系统管理员的历史视角

susudo 命令是为不同的世界设计的。早期的 Unix 计算机需要专职系统管理员,他们使用 root 帐户作为唯一的管理帐户。在那个古老的世界中,受托管理 root 密码的人将以 root 身份登录电传打字机或 CRT 终端(如 DEC VT100),然后执行管理 Unix 计算机所需的管理任务。

root 用户还将拥有一个非 root 帐户,用于非 root 活动,例如编写文档和管理他们的个人电子邮件。这些计算机上通常有很多非 root 用户帐户,这些用户都不需要完全的 root 访问权限。用户可能需要以 root 身份运行一两个命令,但非常不频繁。许多系统管理员以 root 身份登录以作为 root 工作,并在完成后注销我们的 root 会话。有些日子需要整天以 root 身份登录。大多数系统管理员很少使用 sudo,因为它需要键入比运行基本命令更多的内容。

这些工具都提供提升的权限,但它们的方式却大相径庭。这种差异是由于它们最初预期的不同用例造成的。

sudo

sudo 的最初目的是使 root 用户能够将一个或两个非 root 用户委托访问他们经常需要的一个或两个特定的特权命令。sudo 命令为非 root 用户提供临时访问执行诸如添加和删除用户、删除属于其他用户的文件、安装新软件以及通常管理现代 Linux 主机所需的任何任务所需的提升权限。

允许用户访问一个或两个经常使用的需要提升权限的命令,可以为系统管理员节省大量来自用户的请求并消除等待时间。sudo 命令不会切换用户帐户以成为 root;大多数非 root 用户永远不应具有完全的 root 访问权限。在大多数情况下,sudo 允许用户发出一个或两个命令,然后提升权限到期。在这个短暂的时间间隔内(通常配置为 5 分钟),用户可以执行任何需要提升权限的必要管理任务。需要继续使用提升的权限但尚未准备好发出另一个与任务相关的命令的用户可以运行 sudo -v 命令来重新验证凭据并将时间延长 5 分钟。

使用 sudo 命令确实具有生成非 root 用户使用的命令的日志条目的副作用,以及他们的 ID。日志可以促进与问题相关的事后分析,以确定用户何时需要更多培训。(你以为我要说“追究责任”,不是吗?)

su

su 命令旨在允许非 root 用户将其权限级别提升到 root 用户的级别——实际上,非 root 用户变成了 root 用户。唯一的要求是用户知道 root 密码。对此没有限制,因为用户现在以 root 身份登录。

su 命令提供的权限提升没有时间限制。用户可以根据需要以 root 身份工作任意长时间,而无需重新身份验证。完成后,用户可以发出 exit 命令从 root 恢复到自己的非 root 帐户。

争议和变化

最近就 susudo 的使用存在一些争议。

真正的 [系统管理员] 不使用 sudo。 —Paul Venezia

Venezia 在他的 InfoWorld 文章 中认为,sudo 被许多充当系统管理员的人用作不必要的道具。他没有花太多时间为这个立场辩护或解释;他只是将其陈述为一个事实。我同意他的观点——对于系统管理员而言。我们不需要辅助轮来完成我们的工作。事实上,它们会碍事。

然而,

时代在变。 —Bob Dylan

Dylan 是正确的,尽管他不是在唱关于计算机的事情。自从一人一机的时代到来以来,计算机的管理方式发生了重大变化。在许多环境中,计算机的用户也是其管理员。这使得有必要为这些用户提供对 root 权限的某些访问权限。

某些现代发行版,例如 Ubuntu 及其衍生版本,配置为专门使用 sudo 命令执行特权任务。在这些发行版中,不可能直接以 root 用户身份登录,甚至不可能 su 到 root,因此需要 sudo 命令来允许非 root 用户访问 root 权限。在这种环境中,所有系统管理任务都使用 sudo 执行。

可以通过锁定 root 帐户并将常规用户帐户添加到 wheel 组来实现此配置。这种配置可以很容易地被规避。在任何 Ubuntu 主机或 VM 上尝试一个小实验。让我在这里规定设置,以便您可以在需要时重现它。我安装了 Ubuntu 16.04 LTS1,并使用 VirtualBox 将其安装在 VM 中。在安装过程中,我创建了一个非 root 用户 student,并为此实验设置了一个简单的密码。

以用户 student 身份登录并打开终端会话。查看 /etc/shadow 文件中 root 的条目,其中存储了加密密码。

student@ubuntu1:~$ cat /etc/shadow
cat: /etc/shadow: Permission denied

权限被拒绝,因此我们无法查看 /etc/shadow 文件。这在所有发行版中都很常见,以防止非特权用户查看和访问加密密码,否则可以使用常见的黑客工具破解这些密码。

现在让我们尝试 su - 到 root。

student@ubuntu1:~$ su -
Password: <Enter root password – but there isn't one>
su: Authentication failure

这会失败,因为 root 帐户没有密码并且被锁定。使用 sudo 命令查看 /etc/shadow 文件。

student@ubuntu1:~$ sudo cat /etc/shadow
[sudo] password for student: <enter the student password>
root:!:17595:0:99999:7:::
<snip>
student:$6$tUB/y2dt$A5ML1UEdcL4tsGMiq3KOwfMkbtk3WecMroKN/:17597:0:99999:7:::
<snip>

我截断了结果,只显示 root 和 student 用户的条目。我还缩短了加密密码,以便该条目可以放在一行上。字段用冒号 (:) 分隔,第二个字段是密码。请注意,root 的密码字段是一个感叹号,世界其他地方都知道它是感叹号 (!)。这表明该帐户已被锁定且无法使用。

现在,您需要做的就是为 root 帐户设置密码,以便将 root 帐户用作合适的系统管理员。

student@ubuntu1:~$ sudo su -
[sudo] password for student: <Enter password for student>
root@ubuntu1:~# passwd root
Enter new UNIX password: <Enter new root password>
Retype new UNIX password: <Re-enter new root password>
passwd: password updated successfully
root@ubuntu1:~#

现在,您可以直接在控制台上以 root 身份登录,或者直接 su 到 root,而不是每次想要以 root 身份登录时都使用 sudo。当然,您可以每次想要以 root 身份登录时都使用 sudo su -,但何必呢?

请不要误解我的意思。像 Ubuntu 及其上游和下游相关发行版都非常好,多年来我使用过其中的几个。使用 Ubuntu 和相关发行版时,我首先要做的事情之一是设置 root 密码,以便我可以直接以 root 身份登录。其他发行版,如 Fedora 及其相关发行版,现在在安装期间提供了一些有趣的选择。我注意到这一点的第一个 Fedora 版本是 Fedora 34,我在编写一本即将出版的书时安装了很多次。

其中一个安装选项可以在设置 root 密码的页面上找到。新的选项允许用户选择“锁定 root 帐户”,就像 Ubuntu root 帐户被锁定的方式一样。此页面上还有一个选项允许使用密码以 root 身份远程 SSH 登录到此主机,但这仅在 root 帐户解锁时才有效。第二个选项位于允许创建非 root 用户帐户的页面上。此页面上的选项之一是“使此用户成为管理员”。选中此选项后,用户 ID 将添加到一个名为 wheel 组的特殊组中,该组授权该组的成员使用 sudo 命令。Fedora 36 甚至在该复选框的描述中提到了 wheel 组。

可以设置多个非 root 用户作为管理员。使用此方法指定的任何管理员都可以使用 sudo 命令在 Linux 计算机上执行所有管理任务。Linux 在安装期间只允许创建一个非 root 用户,因此可以在创建其他新用户时将他们添加到 wheel 组。现有用户可以由 root 用户或其他管理员直接使用文本编辑器或 usermod 命令添加到 wheel 组。

在大多数情况下,今天的管理员只需要执行一些基本任务,例如添加新打印机、安装更新或新软件或删除不再需要的软件。这些 GUI 工具需要 root 或管理密码,并将接受指定为管理员的用户的密码。

我如何在 Linux 上使用 su 和 sudo

我同时使用 susudo。它们在我的系统管理员工具箱中都占有重要的地位。

我无法锁定 root 帐户,因为我需要使用它来运行我的 Ansible playbook 和我编写的用于执行备份的 rsbu Bash 程序。这些都需要以 root 身份运行,我编写的其他几个管理 Bash 脚本也是如此。我使用 su 命令将用户切换到 root 用户,以便我可以执行这些以及许多其他常见任务。当执行问题确定和解决时,使用 su 将我的权限提升到 root 特别有用。我真的不希望在我正在思考的过程中 sudo 会话超时。

当非 root 用户需要执行需要 root 权限的任务时,我使用 sudo 命令。我在 sudoers 文件中设置非 root 帐户,使其只能访问完成任务所需的一两个命令。当我只需要运行一两个具有提升权限的快速命令时,我自己也使用 sudo

结论

您使用的工具远不如完成工作重要。您使用 vim 还是 Emacs、systemd 还是 SystemV、RPM 还是 DEB、sudo 还是 su 有什么区别?这里的底线是您应该使用您最舒适且最适合您的工具。Linux 和开源的最大优势之一是,对于我们需要完成的每项任务,通常都有许多选项可用。

su sudo 各有优势,并且在正确应用于其预期用例时都可以是安全的。我选择主要在其历史角色中使用 susudo,因为这对我来说很有效。我更喜欢 su 用于我的大部分工作,因为它最适合我和我的工作流程。

在评论中分享您喜欢的工作方式!


本文摘自我的书《系统管理员的 Linux 哲学》(Apress,2018 年)的第 19 章,并经许可转载。

David Both
David Both 是一位开源软件和 GNU/Linux 倡导者、培训师、作家和演讲者。自 1996 年以来,他一直从事 Linux 和开源软件工作,自 1969 年以来一直从事计算机工作。他是“系统管理员的 Linux 哲学”的坚定支持者和传播者。

12 条评论

每次都用 su - 通常您想以 root 身份输入多个命令。在我管理的 Mac 上,第一个终端命令始终是 sudo su -

我使用 su 的一个例子是当我设置 postgresql 并需要将自己添加为用户时。您需要成为用户 postgres,并且没有密码。我那时所做的是 su,然后 su postgres,因为 root 可以成为任何用户而无需密码。

另一个例子是当我想消除 Fedora 中的图形启动时——也就是说,我想在启动过程中看到各种操作的运行情况。您可以通过从 /etc/default/grub 中删除 rhgb quiet 命令来完成此操作(我以自己的身份执行此操作,将其保存在我的主目录中,然后 'sudo cp grub /etc/default/')。

下一步是运行命令 'grub2-mkconfig > /boot/grub2/grub.cfg',但据我所知,您无法使用 sudo 执行此操作,因此您需要成为 root。

“下一步是运行命令 'grub2-mkconfig > /boot/grub2/grub.cfg',但据我所知,您无法使用 sudo 执行此操作,因此您需要成为 root。”

grub2-mkconfig | sudo tee /boot/grub2/grub.cfg

或者如果 grub2-mkconfig 也需要 root 权限

sudo grub2-mkconfig | sudo tee /boot/grub2/grub.cfg

回复 作者 Greg P

su vs sudo:值得考虑
https://askubuntu.com/questions/376199/sudo-su-vs-sudo-i-vs-sudo-bin-bash-when-does-it-matter-which-is-used

很棒的文章,David!我从来不明白这两个命令的区别,现在感谢您的精彩文章,我对它们有了更好的了解。直到大约 15 年前我开始使用 Ubuntu 时,我才开始使用 'sudo'。在此之前,我在 Red Hat 和 Fedora 上的经验是使用 'su'。现在我已经习惯在基于 Ubuntu/Debian 的发行版以及 Fedora 上使用 'sudo',并且很少使用 'su'。

我从不使用 su,因为我的 root 帐户没有设置密码,因此不太容易受到暴力攻击等。

当使用非 root 帐户时,sudo 允许我更轻松地切换到其他用户进行测试,这些用户可能没有将 Bash 配置为 shell,例如 www-data 用户,例如

sudo -u USER COMMAND

文章中设置 root 密码的步骤(如果需要)可以缩短为

sudo passwd

sudo passwd root

以下是一些不使用 su 或 sudo -i 的更多理由

https://wiki.debian.org/sudo

很棒的文章,谢谢。描述历史部分以及用法真的很有趣并且有帮助。

如果我只有几件事要做,我倾向于使用 sudo。

如果我打算执行多项任务,我要么使用 su 命令,要么直接运行“sudo bash”,这让我可以避免 sudo 超时。

正如其他人评论的那样,我可以将“sudo bash”用作跳板,用于像 postgres 帐户这样的帐户,以设置用户角色或在升级 postgresql 引擎之前运行数据库转储。

借用 perl 缩写 TIMTOWTDI。

我一直是“sudo”的拥护者,而不是“su”。可能会更频繁地使用“su”并注意一下。再次感谢。

Creative Commons License本作品根据 Creative Commons Attribution-Share Alike 4.0 International License 获得许可。
© . All rights reserved.