Linux sudo

2025年03月17日 | 阅读 9 分钟

引言

Linux sudo 命令代表 Super User Do。通常,它被用作超级用户被允许执行的一些命令的前缀。

如果我们将该命令与其他命令一起作为前缀,它将以高权限执行该命令。换句话说,它将允许用户以及适当的授权,以其他用户(例如超级用户)的身份执行命令。

它等同于 Windows 中的选项 “以管理员身份运行”。sudo 选项允许我们拥有多个管理员。可以使用 sudo 命令的用户需要在位于 “/etc/sudoers/” 的 sudoers 文件中拥有条目。

注意:要查看或编辑文件,我们必须应用 sudo 命令。为了编辑文件,建议使用“visudo”命令。

sudo 命令默认要求用户使用密码验证自己,该密码是用户密码,而不是 root 密码本身。

sudo 命令语法

sudo 命令的语法如下所述

sudo 命令中的选项

下面解释了 sudo 命令中的一些重要选项

1. -V: 它代表 version (版本)。此选项使 sudo 命令能够打印版本号并退出。如果请求用户已经是 root,-V 选项将打印出默认的 sudo 列表暂停。

Linux sudo

2. -l: 它代表 list (列表)。此选项将帮助打印出用户在当前主机上允许的各种命令。

它显示当前用户可以将每个命令作为 sudo 应用。

Linux sudo

3. -h 或 -help: 在此选项中,h 代表 help (帮助)。此选项使 sudo 命令能够打印使用消息并退出。

Linux sudo

4. -v: 它代表 validate (验证)。如果 sudo 命令将更新用户的时间戳,则 validate 将在必要时提示用户密码。它将 sudo 命令超时延长 5 分钟,但不执行命令。它不提供任何结果。

5. -k: 它代表 kill (终止)。此选项使 sudo 的用户时间戳无效。因此,下次执行 sudo 命令时将需要密码。-k 选项不需要任何密码,它的加入是为了允许用户通过 .logout 文件撤销 sudo 命令的权限。

6. -b: 它代表 background (后台)。此选项通知 sudo 命令在后台执行提供的命令。

注意:如果使用此选项,我们不能使用 shell 任务控制来操纵进程。

Linux sudo

7. -K: 此选项与 -k 选项相同。但是,它代表 sure kill (确切终止)。此选项用于完全删除用户的时间戳。它同样不需要任何密码。

8. -p: 它代表 prompt (提示)。此选项允许我们覆盖(默认)密码提示并应用自定义提示。允许使用一些百分比转义符,如下所示:

  • %u 转换为调用用户的登录名。
  • %U 转换为用户的登录名。
  • %h 转换为本地主机名,不带任何域名。
  • %H 转换为带有域名的本地主机名(仅当机器的主机名完全限定时)。
  • %%(两个连续字符)可以分解为单个 % 字符。
Linux sudo

9. -n: 此选项将在不询问密码的情况下运行命令。如果我们希望将一些命令作为后台任务(或在 shell 脚本中)执行,而我们不希望 sudo 命令询问密码,则此选项非常有用。此选项是 non-interactive(非交互式)的缩写。

10. -u: 它代表 user (用户)。此选项使 sudo 命令能够以用户身份执行所描述的命令,而不是以 root 身份执行。要指定 uid 而不是用户名,我们可以使用 #uid

11. -H: 它代表 HOME。此选项可以将 HOME 环境变量设置为 root 用户的 home 目录,如 passwd 文件中所述。sudo 命令默认不更改 HOME。

12. -s: 它代表 shell (shell)。此选项执行通过 SHELL 环境变量描述的 shell(如果已设置),或者执行 passwd 文件中描述的 shell。

13. -S: 它代表 stdin (标准输入)。此选项使 sudo 命令能够通过标准输入而不是终端设备读取密码。

14. -: 此选项说明 sudo 命令必须停止处理命令行参数。它与 -s 标志结合使用时最有用。

15. -a: 它代表 authentication type (认证类型)。此选项使 sudo 命令能够在验证用户时使用所描述的认证类型,如 /etc/login/.config 所允许。

系统管理员可以通过在 /etc/login/.config 中包含 “auto-sudo” 条目来描述 sudo 特定的认证方法列表。

Linux sudo

sudo 命令中的环境变量

以下是 sudo 命令应用的一些环境变量

序号标签描述
1.EDITOR当 VISUAL 未固定时,它是可在 -e 模式 (sudoedit) 中使用的默认编辑器。
2.HOME它将设置为 -H 或 -s 模式下(或当 sudo 命令使用选项 -enable-shell-sets-home 形成时)目标用户的 home 目录。
3.PATH当选项 secure_path sudoers 固定时,它将设置为一个合理的值。
4.SHELL它可用于确定使用 -s 选项执行的 shell。
5.SUDO_COMMAND它设置为 sudo 命令执行的命令。
6.SUDO_PROMPT它可用作密码提示(默认)。
7.SUDO_USER它设置为请求 sudo 命令的用户的登录名。
8.SUDO_UID它设置为请求 sudo 命令的用户的 uid。
9.SUDO_GID它设置为请求 sudo 命令的用户的 gid。
10.SUDO_PS1如果设置,PS1 将固定为其值。
11.USER它设置为用户(root,除非描述了 -u 选项)。
12.VISUAL它是一个默认编辑器,并在 -e 模式 (sudoedit) 中使用。

sudo 命令的历史

Cliff Spencer 和 Robert Coggeshall 在 1980 年于纽约州立大学/布法罗分校计算机科学系编写了实际的子系统。Robert Coggeshall 将 sudo 带到了科罗拉多大学博尔德分校。在 1986 年至 1993 年间,科罗拉多大学博尔德分校工程学院和计算机科学系的 IT 成员以及 Todd C. Miller 大幅度修改了功能和代码,并将其应用于科学领域。

自 1994 年以来,最新版本由 Todd .C Miller(OpenBSD 开发者)公开管理,并自 1999 年起根据 ISC 风格的许可证共享。

Thomas Claburn 在 2009 年 11 月回应微软拥有 sudo 权限一事时,将此类不确定性描述为言过其实。这些说法被狭义地框定在特定的 GUI 上,而不是 sudo 方法。

sudo 命令的设计

用户可以在必要时向 sudo 提供自己的密码,而不是超级用户,这与 su 命令不同。它允许可访问的用户在不泄露其他帐户密码的情况下行使受限权限。

  • 当配置文件允许用户访问时,系统在认证后会请求声明的命令。
  • sudo 命令通过每个伪终端的宽限时间(通常为 5 分钟)保留了用户的调用权限,它允许用户以声明的用户身份执行各种连续命令,而无需再次提供任何密码。
  • sudo 命令可以配置为记录运行的每个命令,作为审计和安全功能。
  • 当用户尝试调用 sudo 命令但未在配置文件中列出时,会向该用户显示一条异常说明,告知已记录该尝试。
  • 条目将保存在系统中,并且 root 用户将通过邮件收到通知。

sudo 命令的配置

/etc/sudoers 文件包含允许在拥有 root 用户或其他列出用户权限的同时运行一组命令的用户组或用户列表。该程序可以配置为需要密码。

sudo 命令的影响

在一些系统发行版中,sudo 命令已经取代了(默认)使用不同的超级用户登录进行各种管理操作,最重要的是在一些 Apple 的 macOS 以及 Linux 发行版中。

它阻止了一些漏洞利用,并且允许更安全地记录管理命令。

RBAC

sudo 命令可以与 SELinux 协同工作,用于在基于角色的访问控制中在不同类型的角色之间进行转换。

类似程序和工具

visudo 是一个命令行实用程序,允许以故障安全方式编辑 sudo 配置文件。它执行语法和健全性检查,并通过锁阻止多个同时编辑。

runas 程序在 Microsoft Windows 中提供相同的性能;但是,它无法将当前长命令行传递给子进程、环境变量或目录。

它不支持一般提权,但有助于以任何其他用户身份执行子进程。对于 Windows,真正的 sudo 和 su 可以在 Hamilton C shell 中添加,它们可以传输所有这些状态细节并以另一个用户身份或提权启动子进程。

sudo 有 GUI 版本(尤其是 gksudo),但它在 Debian 中已被弃用,并且在 Ubuntu 中也不再使用。各种其他类型的用户界面并非直接基于 sudo 设计,但为管理目标提供了相同的(临时)权限提升,例如 Mac OS X 的授权服务、Microsoft Windows 中的用户帐户控制以及 Unix 类操作系统中的 pkexec

自 OpenBSD 5.8 版本(2015 年 10 月)以来,doas 可用。它已被指定用于取代 OpenBSD 基本系统中的 sudo 命令。

su 与 sudo

如果我们习惯于更经典的 Linux 设置,那么我们习惯于使用 su 命令来获得 root 权限。我们也可以使用 su 命令来有效地以 root 身份登录(root 的主目录成为我们的主目录)。

使用这些类型的发行版,我们也可以以路由用户身份登录。但是,以 root 用户身份登录并不是一个好主意。如果我们使用的发行版依赖于 su 命令并允许 root 用户登录,那么以我们的标准用户身份登录,然后使用 su 命令切换到 root 用户。

我们很可能会发现,在使用基于 sudo 的发行版时,我们无法以 root 用户身份登录。事实上,在 Ubuntu 等一些发行版中,root 用户帐户已被禁用。

我们无法以 root 用户身份登录并使用 su 命令成为 root 用户。我们可以做的是使用 sudo 命令执行这些命令以获得管理权限。

sudo 命令的使用

有两种不同的方法来使用 Linux 执行管理应用程序。我们可以使用 su 命令切换到超级用户或 root 用户,或者我们可以利用 sudo 命令。

当我们在终端上花费时间时,sudo 是我们将非常频繁使用的一个重要命令。使用 sudo 命令而不是以 root 用户身份登录更安全,因为我们可以仅向单个用户授予一些管理权限,而无需他们知道 root 密码。

我们如何实现它取决于我们使用哪个发行版。一些发行版允许 root 用户(如 OpenSUSE、Red HatFedora),而另一些则不允许(如 DebianUbuntu)。

使用 sudo 命令在其最基本的形式中很简单。例如,我们必须执行 dpkg 来安装一个软件。如果标准用户只运行 dpkg -i software.deb 命令,我们将收到一条错误消息,指出用户没有权限运行该命令。

这就是为什么默认情况下,标准用户无法在 Linux 机器上安装各种应用程序。如果要在 Linux 机器上安装任何应用程序,我们需要拥有超级用户的权限。

我们将转而运行 sudo dpkg -i software.deb 命令,以便我们可以成功执行安装。

安装 sudo 命令

sudo 命令包已预装在大多数 Linux 发行版上。要确认该包已安装在我们的系统上,必须遵循以下步骤:

  • 首先,打开我们的终端。
  • 键入 sudo 并单击 Enter 键。
  • 如果我们的系统上安装了 sudo 包,它将显示一条简短消息。
  • 否则,我们将收到一条消息,即 sudo 命令未找到。
  • 如果该包未安装,我们可以通过应用我们发行版的包管理器轻松安装该包。

在 Fedora 和 CentOS 上安装 Sudo

在 Debian 和 Ubuntu 上安装 Sudo


Linux sudo

更新 sudo 的命令

Linux sudo