介绍
你是否曾想过,为什么必须输入 “sudo” 来在 Linux 或 Unix 操作系统环境中执行某些命令?Sudo 实际上是一个缩写,代表 “super-user do”。当您使用 sudo 命令时,您可以使用另一个用户的安全权限来运行程序和执行命令。
默认情况下,sudo 命令允许系统用户以 super-user 的权限执行命令。新安装 of a Linux/Unix 操作系统会创建一个具有超级用户权限的 root 帐户。在进行 Linux/Unix 系统的初始服务器设置时,系统管理员使用 root 帐户登录并向其他系统用户分配系统权限。这些设置存储在名为 sudoers 的文件中。具有 root 权限的帐户可以编辑 sudoers 文件并更改其他用户的权限。
在本教程中,我们将讨论如何获取 root 权限并对 sudoers 文件进行编辑。
前提条件
这是一个动手实践教程,您需要测试这些命令以充分理解本教程。在本教程中,我们将使用 Ubuntu 20.04 服务器,但是,如果您使用的是任何现代 Linux 发行版,例如 Debian 和 CentOS,您也可以按照这些步骤操作。您可以点击 此链接在 CloudSigma 上设置您自己的 Ubuntu 云服务器.
获取 Root 权限
您可以通过以下讨论的三种方式获取 root 权限:
以 root 身份登录
大多数人获取 root 权限最简单的方法是使用 root 用户凭据登录系统。如果您正在访问本地计算机,只需提供用户名,系统就会提示您输入密码。
另一种可以用来以 root 身份登录的方法是使用 SSH —— 一种用于登录服务器并在服务器上执行任务的命令行工具。它需要您服务器的用户名和 IP 地址。以 root 身份登录的语法如下,请替换为您服务器的 IP 地址:
|
1 |
ssh root@your_server_ip_or_domain_name |
当您在终端中输入上述命令时,如果您尚未设置 SSH 密钥,系统将提示您提供密码;如果您已设置了 SSH 密钥,系统将提示您输入 SSH 密钥的密码短语。提供正确的凭据后,您将成功登录。请遵循此 指南,获取有关如何在 Ubuntu 中使用 SSH 连接到远程服务器的逐步说明.
使用 su 成为 root
您可以使用 root 以外的任何其他帐户登录 Linux 系统,这通常是执行非管理任务时的推荐方式。每当您想获取 root 权限时,只需在终端上输入 su 即可:
|
1 |
su |
系统会提示您输入 root 密码,之后您将进入 root shell 会话。在此 shell 会话中,您可以执行所有管理任务,每当您想返回普通 shell 时,只需按 Ctrl + D。或者,您可以在终端上输入 exit 并按回车键。
使用 sudo 运行具有 root 权限的命令
在本教程开始时简要介绍过的 sudo 命令允许您执行单行命令,而无需 root 权限的 shell。您只需输入 sudo 后跟要执行的命令:
|
1 |
sudo execute_this_command |
例如,要更新系统,您可以输入以下内容:
|
1 |
sudo apt-get update |
系统会提示您输入密码。 su 和 sudo 命令的区别在于,su 要求输入 root 密码,而 sudo 要求输入当前用户的密码。默认情况下,用户不会被授予 sudo 访问权限,因为它对系统具有重大的安全影响。我们将在以下章节中对此进行更多讨论。
使用 Visudo 编辑 sudoers 文件
Sudo 权限配置在 sudoers 文件 中,该文件位于 /etc/sudoers. 这些权限是任何用户访问 Linux 系统所必需的。任何语法错误都会导致用户无法登录系统,从而使系统崩溃。
Visudo 命令会使用一个特殊的编辑器打开该文件,该编辑器在保存时会检查文件的语法。因此,非常重要的一点是,您只能使用 visudo 命令来打开文件,以防止您的服务器系统变得不可用。默认情况下,visudo 被设置为使用 (vi) 打开文本编辑器 vim。然而,Ubuntu 已将 visudo 配置为使用 nano 文本编辑器。在 Debian 或 Ubuntu 上,您可以通过输入以下命令来更改为其他编辑器:
|
1 |
sudo update-alternatives --config editor |
它会显示一个编辑器列表,您可以从中选择一个默认编辑器,如屏幕截图所示。选择您偏好的编辑器对应的数字:

在 CentOS Linux 发行版上,编辑 /etc/sudoers 并添加以下行:
|
1 2 |
Defaults editor = /usr/bin/vim:/usr/bin/vi:/usr/bin/nano Defaults env_keep += "EDITOR" |
输入以下命令。请记住替换 your_editor_of_choice 的名称:
|
1 |
export EDITOR=`which your_editor_of_choice` |
该命令将该行添加到 ~/.bashrc 文件中。在终端中输入以下内容以应用更改:
|
1 |
. ~/.bashrc |
现在您的 visudo 已配置完毕,您可以通过输入以下命令打开位于 /etc/sudoers 的文件:
|
1 |
sudo visudo |
编辑 Sudoers 文件
当您运行上一个命令时,该文件将在您配置的主编辑器中打开。以下是该文件的内容:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
# # 此文件必须由 root 用户使用 'visudo' 命令进行编辑。 # # 请考虑在 /etc/sudoers.d/ 中添加本地内容,而不是 # 直接修改此文件。 # # 有关如何编写 sudoers 文件的详细信息,请参阅联机帮助页(man page)。 # Defaults env_reset Defaults mail_badpass Defaults secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin" # 主机别名规范 # 用户别名规范 # 命令别名规范 # 用户权限规范 root ALL=(ALL:ALL) ALL # admin 组的成员可以获得 root 权限 %admin ALL=(ALL) NOPASSWD:ALL # 允许 sudo 组的成员执行任何命令 %sudo ALL=(ALL) NOPASSWD:ALL # 有关 "#include" 指令的更多信息,请参阅 sudoers(5): #includedir /etc/sudoers.d |
注释非常具有描述性,但我们将在下面讨论这些行所表示的含义。
默认行
- Defaults env_reset – 重置终端环境变量以删除任何用户变量。因此,它会从 sudo 会话中清除潜在的有害变量。
- Defaults mail_badpass – 指示系统将 sudo 密码尝试失败的通知邮寄给配置的 mailto 用户,通常是 root 帐户。
- Defaults secure_path – 包含文件系统中的几个路径,sudo 操作在执行时会寻找这些路径中的应用程序来使用,以防止使用其他可能对系统危险的用户定义路径。
用户权限规范行
|
1 |
root ALL=(ALL:ALL) ALL |
- root ALL=(ALL:ALL) ALL – 第一个字段指定该规则将应用到的用户名。在这种情况下,它是 root 用户。
- root ALL=(ALL:ALL) ALL – 第一个 ALL 指定该规则将应用于所有主机。
- root ALL=(ALL:ALL) ALL – 第二个 ALL 指定此规则适用的用户(即 root)可以作为所有用户运行命令。
- root ALL=(ALL:ALL) ALL – 第三个 ALL 指定此规则适用的用户(即 root)可以作为所有组运行命令。
- root ALL=(ALL:ALL) ALL – 最后一个 ALL 指定这些规则适用于所有命令。
根据该规则的指示,root 用户在提供正确的密码后,可以使用 sudo 运行任何命令。
组权限规范行
这些行指定了适用于组的 sudo 权限规则。这些字段表示与用户权限行相同的操作,只有微小的差别。它们以 % 开头以表示组名。
如您所见,admin 组可以在任何主机上作为任何用户执行任何命令。sudo 组具有相同的权限,并具有作为任何组执行命令的附加权限。
包含 /etc/sudoers.d 行
由于行首的 #,#includedir /etc/sudoers.d 行看起来可能像是一条注释。然而,这是一个 include 指令,表示应该引入 /etc/sudoers.d 目录中的文件并将其作为 sudoers 文件的一部分使用。该目录中的文件遵循与 sudoers 文件相同的规则。
该目录中任何不包含点(.)且不以 ~ 结尾的文件都会被读取并附加到 sudoers 文件配置中。该目录允许应用程序在安装时通过将其所有相关规则放入 /etc/sudoers.d 目录中的单个专用文件中来更改 sudo 权限,而无需修改默认的 sudoers 文件。此外,当您想要检查或撤销某个应用程序的权限时,您可以轻松地检查或修改 /etc/sudoers.d 目录中的文件,而无需直接修改 /etc/sudoers 文件。
根据经验,/etc/sudoers.d 目录中的所有文件都应始终使用 visudo 命令进行编辑。以下是语法,请记住在命令中替换您要编辑的文件名:
|
1 |
sudo visudo -f /etc/sudoers.d/file_name_to_edit |
为用户分配 Sudo 权限
当您向新用户授予常规 sudo 访问权限时,这意味着您已赋予该用户帐户对系统的完全管理访问权限。这是系统管理员在创建其他具有 sudo 权限的非 root 用户时执行的常见任务。
在像 Ubuntu 20.04 这样已经拥有通用管理组的系统中,我们可以通过将用户添加到该组来轻松地为用户分配 sudo 权限。在 /etc/sudoers 文件中可以看到,sudo 组具有完全的管理权限,我们可以通过输入以下命令将用户名添加到该组中:
|
1 |
sudo usermod -aG sudo username |
或者,您可以使用 gpasswd 命令来达到相同的目的:
|
1 |
sudo gpasswd -a username sudo |
在 CentOS 上,具有 sudo 权限的默认组名为 wheel,因此您可以使用以下命令分配权限:
|
1 |
sudo usermod -aG wheel username |
或者,使用 gpasswd 命令,您可以使用以下命令达到相同的目的:
|
1 |
sudo gpasswd -a username wheel |
在某些情况下,wheel CentOS 上的组在 /etc/sudoers 文件中可能被注释掉了。要启用它,请使用 visudo 打开该文件,并取消注释包含该组名的行。您可以通过删除行首的 # 来实现此操作:%wheel ALL=(ALL) ALL.
创建自定义规则
掌握了目前为止所学的 sudoers 通用语法知识,现在是时候设置一些规则了。
创建别名
别名允许您通过将项目分组到各种“别名”下来组织 sudoers 文件。我们将在本节中讨论三个指令:User_Alias 用于创建用户/组别名,Cmnd_Alias 用于创建命令别名,以及 Runas_Alias 用于允许一个用户以另一个用户的身份运行。
例如,使用 User_Alias,在您的 /etc/sudoers 文件中,您可以添加以下代码片段来创建三个不同的用户组。某些用户可能属于多个组:
|
1 2 3 |
User_Alias GROUPONE = adelle, nikita, ellie User_Alias GROUPTWO = nikita, brenden, natalia User_Alias GROUPTHREE = brenden, walter, james |
请注意,所有组名都以大写字母开头。在 /etc/sudoers 文件中添加上述组别名后,您可以将更新 apt 数据库的权限分配给 GROUPTWO,方法是在 /etc/sudoers 文件中添加以下规则:
|
1 |
GROUPTWO ALL = /usr/bin/apt-get update |
请注意,如果不指定要以其身份运行的用户/组,sudo 命令将始终默认为 root 用户。
以下是 Cmnd_Alias 的示例,其中我们创建了一个用于关闭和重启系统的命令别名。然后将该规则分配给 GROUPTHREE。在 /etc/sudoers 文件中添加以下行即可实现此目的:
|
1 2 |
Cmnd_Alias POWER = /sbin/shutdown, /sbin/halt, /sbin/reboot, /sbin/restart GROUPTHREE ALL = POWER |
在上面的代码片段中,第一行创建了一个名为 POWER 的命令别名,其中包含关机和重启命令。第二行允许 GROUPTHREE 的成员运行此命令。
以下是 Runas_Alias 的示例,我们创建了一个别名,允许一组用户以另一个用户的身份运行:
|
1 2 |
Runas_Alias WEB = www-data, apache GROUPONE ALL = (WEB) ALL |
在上面的代码片段中,第一行创建了一个名为 WEB 的别名,指定该别名将以 apache 用户或 www-data 用户的身份运行。第二行将该别名分配给 GROUPONE。现在,第一组的成员可以以 apache 或 www-data 用户的身份执行命令。
锁定规则
在本节中,您将学习控制 sudo 对调用的反应的各种方法。在单用户系统上,某些命令是相对无害的。在这种情况下,您可以允许用户以 root 权限执行它们,而无需输入 root 密码。例如,您可以创建一条规则,允许 GROUPONE 中的用户在运行 updatedb 命令时无需输入密码,方法是将以下内容添加到 /etc/sudoers 文件中:
|
1 |
GROUPONE ALL = NOPASSWD: /usr/bin/updatedb |
标签 NOPASSWD 意味着不需要输入密码。与 NOPASSWD 标签相对应的是 PASSWD,这是默认行为。这意味着必须在提示符处提供密码。
除非被其对应标签覆盖,否则标签适用于规则,例如:
|
1 |
GROUPTWO ALL = NOPASSWD: /usr/bin/updatedb, PASSWD: /bin/kill |
在此规则中,GROUPTWO 中的用户可以执行 updatedb 命令而无需输入密码。但是,他们在执行 kill 命令之前必须提供密码。
在某些情况下,您可能希望限制用户执行某些命令,以防止一些危险的执行。这就是 NOEXEC 标签发挥作用的地方。某些程序可以从其界面内部运行其他命令。此类程序的一个例子是 less。如果您在 less 界面中输入具有以下语法的命令,它将运行,从而导致一些意外行为。
|
1 |
!name_of_command_to_run |
为了防止此类行为,您可以将以下规则添加到 /etc/sudoers 文件中,以限制由 username:
|
1 |
username ALL = NOEXEC: /usr/bin/less |
附加信息
在本节中,我们包含了一些在使用 sudo 时您可能会发现必要的附加信息、指令和命令。
如果您在配置中使用了 Runas_Alias,指定用户或组可以作为另一个用户运行,则可以通过对用户使用 -u 标志以及对组使用 -g 标志来作为这些用户执行命令。语法如下:
|
1 2 |
sudo -u run_as_user command sudo -g run_as_group command |
每个命令都会提示您输入关联的密码。为了方便起见,sudo 会将密码保存一段时间,这样您就不必在每次使用 sudo 运行命令时都重复输入密码。在完成 sudo 特权命令后,您可能希望通过输入以下命令来清除该时间:
|
1 |
sudo -k |
如果您有更多需要以 sudo 特权执行的任务,并且希望延长密码请求前的时间,或者希望避免 sudo 命令稍后提示输入密码,您可以通过输入以下命令来更新时间:
|
1 |
sudo -v |
该命令会提示您输入密码并将其缓存,以便稍后使用 sudo。
要列出为您的用户名定义的 sudo 特权,您可以输入以下命令:
|
1 |
sudo -l |
该命令列出了 /etc/sudoers 文件中配置的适用于您用户名的所有规则。通过这些规则,您可以了解您的用户名在系统上可以执行哪些任务。以下是示例截图:

在某些情况下,您执行的命令可能会失败,因为您忘记在前面加上 sudo。在这种情况下,您可能必须重新输入以 sudo 开头的命令。为了避免重新输入命令,您可以利用 bash 的“重复上一个命令”功能。语法是双感叹号。您可以通过输入以下内容来执行您在终端上运行的最后一个命令:
|
1 |
sudo !! |
最后,重要的是要了解 sudo 只是提升了要以 sudo 特权执行的命令。有关其他信息,您可以按照以下链接中的说明进行操作,此链接来和您的用户找点乐子.
结论
在与多个用户一起工作时,熟悉 sudo 命令和 sudoers 文件至关重要。在本教程中,我们介绍了读取和修改 sudoers 文件的基础知识,以及可用于获取 root 特权的各种方法。
请始终记住,特权分离是 Linux 系统安全的原因。因此,不应将超级用户特权授予普通用户。仅分配特定用户在系统中执行其特定任务所绝对必需的特权,而不是所有特权。
祝您使用愉快!
评论
暂无评论。发表第一条评论吧。