本文将比较非 root 用户提权为 root 用户的两个 Linux 命令 的区别。
su
和 sudo
命令都允许用户执行非特权用户不允许做的系统管理任务,即只有 root 用户能执行的命令。有些人更喜欢 sudo
命令:例如 Seth Kenlon 最近发布的一篇 《在 Linux 上使用 sudo 的 5 个理由》,他在其中详细阐述了 sudo
命令的许多优点。
但是,相较于 sudo
命令,我更偏好于 su
命令 来做系统管理工作。在本文中,我比较了这两个命令的区别,并解释了为什么我更喜欢 su
而不是 sudo
,但我仍然同时使用这两个命令的原因。
过去的系统管理员主要使用 su 命令
su
和 sudo
命令是为不同的世界设计的。早期的 Unix 计算机需要全职系统管理员,他们使用 root 用户作为唯一的管理帐户。在这个古老的世界里,有管理员密码的人会在电传打字机或 CRT 终端(例如 DEC VT100)上以 root 用户登录,然后执行一些管理 Unix 计算机的工作。
管理员还会有一些非 root 帐户,用于执行一些非 root 的任务,例如编写文档和管理电子邮件等。在这些 Unix 计算机上通常有许多非 root 帐户,他们都不需要完全的 root 访问权限,只需要以 root 权限运行很少的命令,大约 1 至 2 个就可以了。许多系统管理员以 root 用户登录,完成 root 工作,并在任务完成后,退出 root 会话。有时候,系统管理员需要整天以 root 用户来登录,因为 sudo
命令需要键入更多的内容才能运行必要的命令,因此大多数系统管理员很少使用 sudo
命令。
sudo
和 su
这两个命令都能够提权为 root 用户,但它们实现的方式大不相同。这种差异是由于它们最初打算用于不同的情况。
sudo 命令
sudo
命令的初衷是让 root 用户能够让几个非 root 用户访问他们经常需要的一两个特权命令。sudo
命令允许非 root 用户暂时地获得更高权限,来执行一些特权命令,例如添加和删除用户、删除属于其他用户的文件、安装新软件以及管理现代 Linux 主机所需的任何命令。
sudo
命令允许非 root 用户访问一两个 需要更高权限 的常用命令,这样可以帮助系统管理员节省来自用户的许多请求,并减少等待时间。sudo
命令不会将用户帐户切换为 root 用户,因为大多数非 root 用户永远不应该拥有完全的 root 访问权限。在大多数情况下,sudo
允许用户执行一两个命令,然后提权就会过期。在这个通常为 5 分钟的短暂的提权时间内,用户可以执行任何需要提权的管理命令。需要继续使用提权的用户可以运行 sudo -v
命令来重新验证 root 访问权限,并将提权时间再延长 5 分钟。
使用 sudo
命令还有一些副作用,例如生成非 root 用户使用命令的日志条目及其 ID。这些日志可以在之后作为出现问题的检验,来给用户更多的操作培训。(你以为我会说“问责”用户,对吧?)
su 命令
su
命令能够将非 root 用户提权到 root 权限 —— 事实上,能让非 root 用户成为 root 用户。唯一的要求是用户知道 root 密码。因为用户已经以 root 权限登录,所以之后的操作就没有限制了。
su
命令所提供的提权没有时间限制。用户可以作为 root 执行命令,不需要进行重新验证是否有 root 权限。完成任务后,用户可以执行退出命令 exit
,从 root 用户恢复到自己原来的非 root 帐户。
su 和 sudo 在使用上的争议和变化
最近在 su
与 sudo
的使用上存在一些分歧。
真正的系统管理员不会使用
sudo
。—— Paul Venezia
Venezia 在他的 InfoWorld 文章 中辩称,对于许多担任系统管理员的人来说,sudo
是一个不必要的工具。他没有花太多时间为这个观点进行解释,他只是把它说成了一个事实。我同意他对于系统管理员的观点,因为我们不需要 sudo
来完成我们的工作。事实上,sudo
使得事情变得更复杂了。
然而,
时代在“改变”。—— Bob Dylan
Bob Dylan 是对的,尽管他唱的歌不是指计算机(LCTT 译注:Bob Dylan 是美国创作歌手、艺术家和作家,这里指他不是针对于电脑而说的)。
自从人手一台的个人计算机时代到来,计算机的管理方式发生了重大变化。在许多环境中,计算机的使用者也是它的管理员,这使得为这些用户提供一些对 root 权限的访问是有必要的。
一些现代发行版,例如 Ubuntu 及其衍生版本,只能使用 sudo
命令来执行特权命令。在这些发行版中,用户无法直接以 root 用户身份登录,甚至无法通过 su
切换到 root,因此需要 sudo
命令来允许非 root 用户获得 root 权限。在这一环境中,所有系统管理任务均使用 sudo
来执行。
通过锁定 root 帐户并将常规用户帐户添加到“轮子”组(wheel
),可以实现此配置,但是这种配置很容易被绕过。接下来,让我们在 Ubuntu 主机或虚拟机上尝试一些小实验吧。我在这里说明一些我的设置,以便你可以根据需要来重现它。我安装的是 Ubuntu 16.04 LTS1,并使用 VirtualBox 将其安装在虚拟机中。在安装过程中,我创建了一个非 root 用户 student
,为了简便起见我给这个用户设置了一个简单的密码。
以 student
用户身份登录 Ubuntu,并打开终端。查看 /etc/shadow
文件中的 root 条目,其中存储了经哈希的密码。
student@ubuntu1:~$ cat /etc/shadow
cat: /etc/shadow: Permission denied
可以看到终端拒绝了我们对 /etc/shadow
的访问,因此我们无法查看 /etc/shadow
文件。所有发行版都是如此,以防止非特权用户看到和访问加密的密码,因为非特权用户可能会使用常见的黑客工具来破解这些密码。
现在,让我们使用 su -
命令来成为 root 用户。
student@ubuntu1:~$ su -
Password: