Linux su vs sudo:有什么区别?

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

Opensource.com

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

另一方面,我偏爱 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

迪伦是正确的,尽管他不是在唱关于计算机的事情。自从一人一机时代来临以来,计算机的管理方式发生了很大的变化。在许多环境中,计算机的用户也是其管理员。这使得有必要为这些用户提供对 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 的密码字段是一个bang,在世界其他地方被称为感叹号 (!)。这表明该帐户已被锁定并且无法使用。

现在,你需要做的就是为 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,而不是为每个命令使用 sudo。当然,你可以每次想要以 root 身份登录时都使用 sudo su -,但何必呢?

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

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

可以设置多个非 root 用户作为管理员。使用此方法指定的任何管理员都可以使用 sudo 命令在 Linux 计算机上执行所有管理任务。Linux 在安装期间只允许创建一个非 root 用户,因此可以在创建其他新用户时将其添加到 wheel 组。现有用户可以直接使用文本编辑器或 usermod 命令由 root 用户或其他管理员添加到 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 用于我自己的大多数工作,因为它最适合我和我的工作流程。

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


本文摘自我 2018 年出版的《系统管理员的 Linux 哲学》(Apress 出版)的第 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本作品采用知识共享署名-相同方式共享 4.0 国际许可协议进行许可。
© . All rights reserved.