Linux的su与sudo:有什么区别?

294 阅读10分钟

bash logo on green background

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身份登录。大多数系统管理员很少使用sudo ,因为它需要键入更多必要的命令来运行。

这些工具都提供了升级的权限,但它们的方式明显不同。这种差异是由于它们最初的用途不同而造成的。

sudo

sudo 的初衷是使根用户能够授权给一两个非根用户访问他们经常需要的一两个特定的特权命令。sudo 命令让非root用户临时访问执行任务所需的高权限,如添加和删除用户,删除属于其他用户的文件,安装新软件,以及一般管理现代Linux主机所需的任何任务。

允许用户访问一两个需要提升权限的常用命令,可以为系统管理员节省大量来自用户的请求,并消除等待时间。sudo 命令不会将用户账户切换成root;大多数非root用户不应该有完全的root权限。在大多数情况下,sudo 让用户发布一到两条命令,然后允许权限升级过期。在这个短暂的时间间隔内,通常被配置为5分钟,用户可以执行任何需要提升权限的必要管理任务。如果用户需要继续使用高权限工作,但还没有准备好发布另一个与任务相关的命令,可以运行sudo -v 命令来重新验证证书,并将时间再延长5分钟。

使用sudo 命令确实有一个副作用,即产生非root用户使用的命令的日志条目,以及他们的ID。这些日志可以促进与问题有关的事后总结,以确定用户何时需要更多培训。(你以为我会说 "分配责任 "之类的话,对吗?)

su

su 命令的目的是允许非根用户将其权限级别提升到根用户的级别--事实上,非根用户成为根用户。唯一的要求是该用户必须知道root密码。这方面没有任何限制,因为用户现在是以root身份登录的。

su命令所提供的权限升级没有时间限制。用户可以在必要的时候以root身份工作,而不需要重新认证。完成后,用户可以发出exit命令,从root身份恢复到自己的非root账户。

争论和变化

最近对于susudo 的用途有一些分歧。

真正的[Sysadmins]不使用sudo。-Paul Venezia

Venezia在他的InfoWorld文章中争辩说,对于许多充当系统管理员的人来说,sudo 被当作一个不必要的道具。他并没有花很多时间为这一立场进行辩护或解释;他只是把它作为一个事实来陈述。我同意他的观点,对于系统管理员来说。我们不需要训练轮来做我们的工作。事实上,它们会妨碍我们的工作。

然而。

*时代在变化。-*鲍勃-迪伦

迪伦是正确的,尽管他不是在唱计算机。自从一人一机时代的到来,计算机的管理方式已经发生了重大变化。在许多环境中,计算机的用户也是它的管理员。这使得有必要为这些用户提供一些访问root的权力。

一些现代发行版,如Ubuntu及其衍生产品,被配置为只使用sudo 命令来执行特权任务。在这些发行版中,不可能直接以根用户的身份登录,甚至不可能将su ,所以需要使用sudo 命令来允许非根用户访问根权限。在这种环境下,所有的系统管理任务都使用sudo

这种配置可以通过锁定root账户并将普通用户账户加入wheel组来实现。这种配置可以被轻易地规避。在任何Ubuntu主机或虚拟机上做个小实验。让我在这里规定一下设置,如果你愿意,你可以复制它。我安装了Ubuntu 16.04 LTS1,并使用VirtualBox将其安装在一个虚拟机中。在安装过程中,我创建了一个非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的密码字段是一个 "*砰 "*字,在世界其他地方被称为惊叹号(!)。这表明该账户被锁定,不能使用。

现在,你需要做的就是为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身份登录控制台,或者直接以root身份登录su ,而不是在每个命令中使用sudo 。当然,你可以在每次想以root身份登录时直接使用sudo su - ,但为什么要这么麻烦呢?

请不要误解我的意思。像Ubuntu这样的发行版以及它们的上下游亲属是完全没有问题的,这些年来我已经使用了其中的几个。当使用Ubuntu和相关发行版时,我做的第一件事就是设置一个root密码,这样我就可以直接以root身份登录了。其他发行版,比如Fedora和它的亲戚,现在在安装时提供了一些有趣的选择。我注意到的第一个Fedora版本是Fedora 34,我在写一本即将出版的书时已经安装了很多次。

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

多于一个非root用户可以被设置为管理员。任何使用这种方法指定为管理员的人都可以使用sudo 命令来执行Linux计算机上的所有管理任务。Linux在安装过程中只允许创建一个非根用户,所以其他新用户可以在创建时被添加到轮子组中。现有的用户可以由根用户或其他管理员通过使用文本编辑器或usermod 命令直接添加到轮子组中。

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

我如何在Linux上使用su和sudo

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

我不能锁定root账户,因为我需要用它来运行我的Ansibleplaybooks和我写的用于执行备份的rsbuBash程序。这两个程序都需要以root身份运行,我写的其他几个管理Bash脚本也是如此。我使用su 命令将用户切换到根用户,这样我就可以执行这些和其他许多常见的任务。使用su ,将我的权限提升到root,在进行问题判断和解决时特别有帮助。我真的不希望当我正在思考的时候,一个sudo 会话却在我身上超时。

当非root用户需要执行那些需要root权限的任务时,我使用sudo 命令。我在sudoers文件中为非root账户设置了权限,只允许使用完成任务所需的一两个命令。当我需要用升级的权限只运行一两个快速命令时,我自己也会使用sudo

为系统管理员提供的更多信息

启用系统管理员博客

自动化的企业。用自动化管理IT的指南

电子书。启用Sysadmins的Ansible自动化

来自现场的故事。一个系统管理员的IT自动化指南

电子书。创业者和系统管理员的Kubernetes指南

最新的系统管理员文章

结论

你使用的工具并不像完成工作那么重要。如果你使用vim或Emacs,systemd或SystemV,RPM或DEB,sudosu ,这有什么区别呢?这里的底线是,你应该使用你最熟悉的、对你最有用的工具。Linux和开源的最大优势之一是,我们需要完成的每项任务通常都有很多选择。

susudo 都有长处,而且如果在预定的使用情况下应用得当,两者都可以是安全的。我选择使用susudo ,主要是为了发挥它们的历史作用,因为这对我来说很有效。在我自己的大部分工作中,我更喜欢使用su ,因为它最适合我和我的工作流程。

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