sudo, sudoedit — 以另一个用户的身份执行命令
概要
sudo -h | -K | -k | -V
sudo -v [-ABkNnS] [-g group] [-h host] [-p prompt] [-u user]
sudo -l [-ABkNnS] [-g group] [-h host] [-p prompt] [-U user] [-u user] [命令 [参数 ...]]
sudo [-ABbEHnPS] [-C num] [-D directory] [-g group] [-h host] [-p prompt] [-R directory]
[-r role] [-t type] [-T timeout] [-u user] [VAR=value] [-i | -s] [命令 [参数 ...]]
sudoedit [-ABkNnS] [-C num] [-D directory] [-g group] [-h host] [-p prompt] [-R directory]
[-r role] [-t type] [-T timeout] [-u user] 文件 ...
描述
sudo 允许授权用户以超级用户或其他用户的身份执行命令,具体由安全策略指定。调用用户的实际(而非有效)用户 ID 用于确定要查询安全策略的用户名。
sudo 支持用于安全策略、审计和输入/输出日志记录的插件架构。第三方可以开发和分发自己的插件,使其与 sudo 前端无缝协作。默认安全策略是 sudoers,它通过 /etc/sudoers 文件或通过 LDAP 进行配置。有关更多信息,请参见“插件”部分。
安全策略确定用户是否有权运行 sudo,如果有,则确定用户的权限。策略可能要求用户使用密码或其他身份验证机制进行身份验证。如果需要身份验证,并且用户未在可配置的时间限制内输入密码,则 sudo 将退出。此限制是特定于策略的;默认 sudoers 安全策略的密码提示超时时间为 0 分钟。
安全策略可以支持凭据缓存,从而允许用户在一段时间内无需进行身份验证即可再次运行 sudo。默认情况下,sudoers 策略会在每个终端的基础上缓存凭据 15 分钟。有关更多信息,请参见 sudoers(5) 中的 timestamp_type 和 timestamp_timeout 选项。通过使用 -v 选项运行 sudo,用户可以在不运行命令的情况下更新缓存的凭据。
在系统中,如果 sudo 是获取超级用户权限的主要方法,则必须避免在安全策略配置文件中出现语法错误。对于默认安全策略,sudoers(5),应使用 visudo(8) 实用程序进行配置文件的更改,以确保不会引入任何语法错误。
当作为 sudoedit 调用时,将隐含 -e 选项(如下所述)。
安全策略和审计插件可以记录成功和失败的 sudo 运行尝试。如果配置了 I/O 插件,则可以记录运行命令的输入和输出。
选项如下:
-A, --askpass
通常,如果 sudo 需要密码,它将从用户的终端读取密码。如果指定了 -A(askpass)选项,则会执行一个(可能是图形化的)辅助程序来读取用户的密码,并将密码输出到标准输出。如果设置了 SUDO_ASKPASS 环境变量,则它指定辅助程序的路径。否则,如果 sudo.conf(5) 包含指定 askpass 程序的行,则将使用该值。例如:
# askpass 辅助程序的路径
Path askpass /usr/bin/ssh-askpass
如果没有可用的 askpass 程序,sudo 将会出错并退出。
-B, --bell
当终端存在时,在密码提示符中发出蜂鸣声。如果使用 askpass 程序,则此选项无效。
-b, --background
在后台运行给定的命令。无法使用 shell 作业控制来操作由 sudo 启动的后台进程。大多数交互式命令在后台模式下都无法正常工作。
-C num, --close-from=num
在执行命令之前,关闭所有大于或等于 num 的文件描述符。不允许使用小于 3 的值。默认情况下,sudo 在执行命令时会关闭所有打开的文件描述符,除了标准输入、标准输出和标准错误。安全策略可能会限制用户使用此选项的能力。sudoers 策略仅允许在管理员启用了 closefrom_override 选项时使用 -C 选项。
-D directory, --chdir=directory
在指定的目录中运行命令,而不是在当前工作目录中运行。如果用户没有权限指定工作目录,安全策略可能会返回错误。
-E, --preserve-env
指示安全策略,用户希望保留其现有的环境变量。如果用户没有权限保留环境,安全策略可能会返回错误。
--preserve-env=list
指示安全策略,用户希望将逗号分隔的变量列表添加到从用户环境保留的变量中。如果用户没有权限保留环境,安全策略可能会返回错误。 此选项可以多次指定。
-e, --edit
编辑一个或多个文件,而不是运行命令。不使用路径名时,将使用字符串“sudoedit”来咨询安全策略。如果策略授权,则将执行以下步骤:
将要编辑的文件复制到临时副本中,并将所有者设置为调用用户。
运行策略中指定的编辑器来编辑临时文件。sudoers 策略使用 SUDO_EDITOR、VISUAL 和 EDITOR 环境变量(按此顺序)。如果未设置 SUDO_EDITOR、VISUAL 或 EDITOR 中的任何一个,则将使用 sudoers(5) 选项中列出的第一个程序。
如果这些文件已被修改,临时文件将被复制回其原始位置,并且临时版本将被删除。
为了防止编辑未经授权的文件,除非安全策略明确允许,否则将强制执行以下限制:
符号链接不能被编辑(版本 1.8.15 及更高版本)。
当父目录可被调用用户写入时,路径中的符号链接不会被跟随,除非该用户是 root 用户(版本 1.8.16 及更高版本)。
位于可被调用用户写入的目录中的文件不能被编辑,除非该用户是 root 用户(版本 1.8.16 及更高版本)。
用户绝不允许编辑设备特殊文件。
如果指定的文件不存在,它将被创建。与大多数由 sudo 运行的命令不同,编辑器将以未修改的调用用户的环境运行。如果出于某种原因,临时文件在编辑后变得为空,用户将被提示后再进行安装。
如果,由于某种原因,sudo 无法使用其编辑后的版本更新文件,用户将收到警告,并且编辑后的副本将保留在一个临时文件中。
-g group, --group=group
以指定的组而不是目标用户密码数据库条目中指定的组作为主要组来运行命令。该组可以是组名,也可以是以“#”字符为前缀的数字组 ID(GID)(例如,“#0”表示 GID 0)。当以 GID 运行命令时,许多 shell 要求将“#”用反斜杠(\)转义。如果没有指定 -u 选项,则命令将以调用用户的身份运行。在任何一种情况下,主要组都将被设置为该组。sudoers 策略允许通过 -g 选项指定目标用户的任何组,只要不使用 -P 选项。
-H, --set-home
请求安全策略将 HOME 环境变量设置为目标用户密码数据库条目中指定的家目录。根据策略,这可能是默认行为。
-h, --help
在标准输出上显示简短的帮助消息并退出。
-h host, --host=host
如果安全策略插件支持远程命令,则在指定的宿主机上运行命令。sudoers 插件当前不支持运行远程命令。这也可以与 -l 选项结合使用,以列出用户在远程宿主机上的权限。
-i, --login
以目标用户密码数据库条目中指定的用户的身份运行 shell,作为登录 shell。这意味着 shell 将读取登录特定的资源文件,例如 .profile、.bash_profile 或 .login。如果指定了命令,则该命令将被作为简单命令传递给 shell,使用 -c 选项。该命令和任何参数都会被连接起来,用空格分隔,并且每个字符(包括空格)都会用反斜杠(\)进行转义,但字母数字、下划线、连字符和美元符号除外。如果没有指定命令,则将执行交互式 shell。sudo 尝试在运行 shell 之前更改为该用户的家目录。该命令将在类似于用户在登录时接收的环境中运行。大多数 shell 在指定命令与交互式会话时表现不同;请参阅 shell 的手册以获取详细信息。sudoers(5) 手册中的“命令环境”部分记录了 -i 选项如何影响在使用 sudoers 策略时命令运行的环境。
-K, --remove-timestamp
类似于 -k 选项,但会删除用户的所有缓存凭据,无论终端或父进程 ID 如何。 下次运行 sudo 时,如果安全策略需要身份验证,则必须输入密码。 不可以将 -K 选项与命令或其他选项一起使用。 此选项不需要密码。 并非所有安全策略都支持凭据缓存。
-k, --reset-timestamp
在不使用命令的情况下,它会使当前会话中用户的缓存凭据无效。 下次在会话中运行 sudo 时,如果安全策略需要身份验证,则必须输入密码。 默认情况下,sudoers 策略为每个终端(或如果没有终端,则为父进程 ID)在凭据缓存中使用单独的记录。 这可以防止 -k 选项干扰在不同终端会话中运行的 sudo 命令。 有关更多信息,请参阅 sudoers(5) 中的 timestamp_type 选项。 此选项不需要密码,并添加了该选项,以允许用户从 .logout 文件中撤销 sudo 权限。
当与命令或可能需要密码的选项一起使用时,此选项将导致 sudo 忽略用户的缓存凭据。 结果,sudo 将提示输入密码(如果安全策略要求),并且不会更新用户的缓存凭据。
并非所有安全策略都支持凭据缓存。
-l, --list
如果没有指定命令,则列出调用用户(或由 -U 选项指定的用户)在当前主机上的权限。 如果多次指定此选项并且安全策略支持详细输出格式,则使用更长的列表格式。
如果指定了命令,并且安全策略允许调用用户(或由 -U 选项指定的用户)在当前主机上执行该命令,则将显示命令的完全限定路径以及所有参数。 如果 -l 选项指定多次(并且安全策略支持),则将以详细格式显示匹配规则以及该命令。 如果指定了命令但策略不允许,则 sudo 将以 1 的状态值退出。
-N, --no-update
即使用户成功进行身份验证,也不要更新用户的缓存凭据。
与 -k 标志不同,如果现有的缓存凭据有效,则会使用它们。 要检测用户的缓存凭据是否有效(或者何时不需要进行身份验证),可以使用以下命令:
sudo -Nnv
并非所有安全策略都支持凭据缓存。
-n, --non-interactive
避免提示用户输入任何内容。 如果命令需要密码,sudo 将显示错误消息并退出。
-P, --preserve-groups
保持调用用户的组向量不变。 默认情况下,sudoers 策略会将组向量初始化为目标用户所属的组列表。 但是,实际和有效的组 ID 仍然设置为与目标用户匹配。
-p prompt, --prompt=prompt
使用带有可选转义序列的自定义密码提示。 sudoers 策略支持以下百分号 (%) 转义序列:
%H 扩展为包括域名的主机名(仅当机器的主机名完全限定或在 sudoers(5) 中设置了 fqdn 选项时)
%h 扩展为不带域名的本地主机名
%p 扩展为请求密码的用户的名称(尊重 sudoers(5) 中的 rootpw、targetpw 和 runaspw 标志)
%U 扩展为命令将要运行的用户(默认情况下为 root,除非也指定了 -u 选项)的登录名
%u 扩展为调用用户的登录名
%% 两个连续的 '%' 字符折叠为一个 '%' 字符
自定义提示将覆盖安全策略或 SUDO_PROMPT 环境变量指定的默认提示。 在使用 PAM 的系统上,自定义提示还将覆盖 PAM 模块指定的提示,除非在 sudoers 中禁用了 passprompt_override 标志。
-R directory, --chroot=directory
在运行命令之前,切换到指定的根目录(参见 chroot(8))。 如果用户没有权限指定根目录,安全策略可能会返回错误。
此选项已弃用,将在 sudo 的未来版本中删除。
-r role, --role=role
使用包含指定角色的 SELinux 安全上下文运行命令。
-S, --stdin
将提示写入标准错误并从标准输入读取密码,而不是使用终端设备。
-s, --shell
如果设置了 SHELL 环境变量,则运行由 SHELL 环境变量指定的 shell,或者运行调用用户密码数据库条目中指定的 shell。 如果指定了命令,则将其作为简单命令传递给 shell,并使用 -c 选项。 命令和任何参数都连接起来,用空格分隔,并且每个字符(包括空格)都用反斜杠 ('\') 进行转义,但字母数字、下划线、连字符和美元符号除外。 如果未指定命令,则将执行一个交互式 shell。 大多数 shell 在指定命令时与在交互式会话中时的行为不同;请参阅 shell 的手册以了解详细信息。
-t type, --type=type
使用包含指定类型的 SELinux 安全上下文来运行命令。如果未指定类型,则默认类型将从角色派生。
-U user, --other-user=user
与 -l 选项结合使用,以列出用户的权限,而不是列出调用用户的权限。安全策略可能会限制列出其他用户的权限。在使用 sudoers 策略时,-U 选项仅限于 root 用户以及具有以下权限的用户:指定用户的“list”权限,或者能够在当前主机上以 root 用户或用户身份运行任何命令。
-T timeout, --command-timeout=timeout
用于设置命令的超时时间。如果超时时间到期,而命令尚未退出,则该命令将被终止。安全策略可能会限制用户设置超时时间的能力。sudoers 策略要求用户指定的超时时间必须明确启用。
-u user, --user=user
以与默认目标用户(通常是 root 用户)不同的用户身份运行命令。用户可以是用户名,也可以是带有“#”字符前缀的数字用户 ID (UID)(例如,“#0”表示 UID 0)。当以 UID 运行命令时,许多 shell 都要求使用反斜杠(\)来转义“#”。某些安全策略可能会限制 UID,使其仅限于密码数据库中列出的 UID。sudoers 策略允许使用密码数据库中不存在的 UID,只要目标用户选项未设置。其他安全策略可能不支持此功能。
-V, --version
打印 sudo 版本字符串以及任何已配置插件的版本字符串。如果调用用户已经是 root 用户,则 -V 选项将显示在构建 sudo 时传递给 configure 的选项;插件可能会显示其他信息,例如默认选项。
-v, --validate
更新用户的缓存凭据,并在必要时对用户进行身份验证。对于 sudoers 插件,默认情况下,这会将 sudo 超时时间延长 15 分钟,但不会运行命令。并非所有安全策略都支持缓存凭据。
--
-- 用于分隔 sudo 选项的结尾。后续选项将传递给命令。
接受值的选项只能指定一次,除非其描述中另有说明。这是为了防止由编写不佳的脚本引起的问题,这些脚本通过用户控制的输入调用 sudo。
要为命令设置的环境变量也可以作为选项传递给 sudo,形式为 VAR=value,例如 LD_LIBRARY_PATH=/usr/local/pkg/lib。环境变量可能会受到安全策略插件施加的限制。sudoers 策略对作为选项传递的环境变量施加与现有环境变量相同的限制,但有一个重要的区别。如果 sudoers 中的 setenv 选项已设置,则要运行的命令具有 SETENV 标记,或者匹配的命令为 ALL,则用户可以设置通常会被禁止的变量。有关更多信息,请参阅 sudoers(5)。
命令执行
当 sudo 执行命令时,安全策略指定命令的执行环境。 通常,实际用户 ID 和有效用户 ID 以及实际组 ID 和有效组 ID 会设置为与密码数据库中指定的的目标用户匹配,并且基于组数据库初始化组向量(除非指定了 -P 选项)。
安全策略可以指定以下参数:
实际用户 ID 和有效用户 ID
实际组 ID 和有效组 ID
辅助组 ID
环境列表
当前工作目录
文件创建模式掩码(umask)
SELinux 角色和类型
调度优先级(也称为 nice 值)
进程模型
sudo 可以通过两种不同的方式运行命令。
如果配置了 I/O 日志记录插件以记录终端 I/O,或者安全策略明确要求,则会分配一个新的伪终端(“pty”),并使用 fork(2) 创建第二个 sudo 进程,称为监视器。 监视器创建一个新的终端会话,以自身作为领导者,并将 pty 作为其控制终端,再次调用 fork(2),设置上述执行环境,然后使用 execve(2) 系统调用在子进程中运行命令。 监视器用于在用户的终端和命令正在运行的 pty 之间转发作业控制信号。 这使得可以正常地暂停和恢复命令。 如果没有监视器,该命令将处于 POSIX 术语中的“孤立进程组”,它将不会从内核接收任何作业控制信号。 当命令退出或由信号终止时,监视器将命令的退出状态传递给主 sudo 进程,然后退出。 收到命令的退出状态后,主 sudo 进程将命令的退出状态传递给安全策略的关闭函数,以及任何已配置的审计插件的关闭函数,然后退出。 此模式是 sudo 版本 1.9.14 及更高版本在使用 sudoers 策略时的默认模式。
如果没有使用 pty,sudo 调用 fork(2),设置上述执行环境,然后使用 execve(2) 系统调用在子进程中运行命令。 主 sudo 进程等待命令完成,然后将命令的退出状态传递给安全策略的关闭函数,以及任何已配置的审计插件的关闭函数,然后退出。 作为一种特殊情况,如果策略插件未定义关闭函数,sudo 将直接执行命令,而不是首先调用 fork(2)。 sudoers 策略插件仅在启用 I/O 日志记录、需要 pty、指定了 SELinux 角色、命令具有关联的超时或启用了 pam_session 或 pam_setcred 选项时定义关闭函数。 pam_session 和 pam_setcred 默认在可以使用 PAM 的系统上启用。 此模式是 sudo 版本早于 1.9.14 且使用 sudoers 策略时的默认模式。
在那些使用 PAM 的系统中,安全策略的关闭函数负责关闭 PAM 会话。它也可以记录命令的退出状态。
信号处理
当命令作为 sudo 进程的子进程运行时,sudo 会将它收到的信号转发给该命令。SIGINT 和 SIGQUIT 信号仅在命令在新 pty 中运行时或信号由用户进程发送时才会被转发。这可以防止命令每次用户按下 Ctrl+C 时收到两次 SIGINT 信号。一些信号,如 SIGSTOP 和 SIGKILL,无法捕获,因此不会转发给命令。通常,如果要暂停由 sudo 运行的命令,应使用 SIGTSTP 代替 SIGSTOP。
作为一种特殊情况,sudo 不会转发由其正在运行的命令发送的信号。这可以防止命令意外地杀死自身。在某些系统上,reboot(8) 实用程序在重新启动系统之前,会将 SIGTERM 信号发送到所有非系统进程(除了自身)。这可以防止 sudo 转发它收到的 SIGTERM 信号回 reboot(8),否则 reboot(8) 可能会在系统实际重新启动之前退出,导致系统处于半死状态,类似于单用户模式。请注意,此检查仅适用于 sudo 运行的命令,而不适用于该命令可能创建的任何其他进程。因此,通过 sudo 运行一个调用 reboot(8) 或 shutdown(8) 的脚本可能会导致系统进入这种未定义状态,除非 reboot(8) 或 shutdown(8) 使用 exec() 系列函数而不是 system() 运行(system() 会在命令和调用进程之间插入一个 shell)。
插件
可以通过 sudo.conf(5) 文件中的 Plugin 指令来指定插件。它们可以作为动态共享对象(在支持它们的系统上)加载,也可以直接编译到 sudo 二进制文件中。如果不存在 sudo.conf(5) 文件,或者它不包含任何 Plugin 行,则 sudo 将使用 sudoers(5) 作为策略、审计和 I/O 日志记录插件。有关 /etc/sudo.conf 文件的详细信息,请参阅 sudo.conf(5) 手册,有关 sudo 插件架构的更多信息,请参阅 sudo_plugin(5) 手册。
退出值
在成功执行命令后,sudo 的退出状态将是已执行程序的退出状态。如果命令因接收到信号而终止,sudo 会将相同的信号发送给自己。
如果指定了 -l 选项但未提供命令,则如果用户允许运行 sudo 并且已成功进行身份验证(如安全策略所必需),sudo 将以值为 0 退出。如果使用 -l 选项指定了命令,则只有当该命令受安全策略允许时,退出值才为 0,否则为 1。
如果发生身份验证失败、配置/权限问题,或者如果给定的命令无法执行,sudo 将以值为 1 退出。在这种情况下,错误字符串将打印到标准错误。如果 sudo 无法 stat(2) 用户 PATH 中的一个或多个条目,则会向标准错误打印错误。(如果目录不存在或实际上不是目录,则该条目将被忽略,并且不会打印任何错误。)在正常情况下,这不应该发生。[stat]({filename}../../stat)(2) 返回“权限被拒绝”的最常见原因是,您正在运行自动挂载器,并且您的 PATH 中的一个目录位于当前无法访问的机器上。
安全说明
sudo 尝试在执行外部命令时保持安全。
为了防止命令欺骗,sudo 在用户的 PATH 中搜索命令时,会最后检查“.”和“”(两者都表示当前目录)。根据安全策略,用户的 PATH 环境变量可能会被修改、替换或以不变的形式传递给 sudo 执行的程序。
用户不应被授予 sudo 权限以执行用户可以写入或位于用户可以写入的目录中的文件。如果用户可以修改或替换命令,则无法限制他们可以运行的其他命令。
默认情况下,sudo 仅记录其明确运行的命令。如果用户运行诸如“sudo su”或“sudo sh”之类的命令,则从该 shell 运行的后续命令不受 sudo 的安全策略的约束。对于提供 shell 转义的命令(包括大多数编辑器),也是如此。如果启用了 I/O 记录,后续命令的输入和/或输出将被记录,但不会为这些命令记录传统的日志。因此,在通过 sudo 授予用户访问权限时,必须小心验证该命令是否不会无意中为用户提供有效的 root shell。有关解决此问题的方法,请参见 sudoers(5) 中的“防止 shell 转义”部分。
为了防止泄露潜在的敏感信息,sudo 默认情况下在执行期间禁用核心转储(在执行期间会重新启用核心转储)。这种做法可以追溯到大多数操作系统允许设置用户 ID 进程默认情况下转储核心转储的时代。为了帮助调试 sudo 崩溃,您可能希望通过在 sudo.conf(5) 文件中将“disable_coredump”设置为 false 来重新启用核心转储,如下所示:
将 disable_coredump 设置为 false
有关更多信息,请参阅 sudo.conf(5) 手册。
环境变量
sudo 使用以下环境变量。安全策略控制命令的实际环境内容。
EDITOR:在 -e(sudoedit)模式下使用的默认编辑器,如果未设置 SUDO_EDITOR 或 VISUAL。
MAIL:当指定 -i 选项时,或者当在 sudoers 中启用 env_reset 时,设置为目标用户的邮件 spool(除非 MAIL 存在于 env_keep 列表中)。
HOME:当指定 -i 或 -H 选项时,当指定 -s 选项且在 sudoers 中设置了 set_home 时,当在 sudoers 中启用 always_set_home 时,或者当启用 env_reset 选项且 HOME 不存在于 env_keep 列表中时,设置为目标用户的家目录。
LOGNAME:当指定 -i 选项时,当在 sudoers 中启用 set_logname 选项时,或者当启用 env_reset 选项时(除非 LOGNAME 存在于 env_keep 列表中),设置为目标用户的登录名。
PATH:可能被安全策略覆盖。
SHELL:用于确定使用 -s 选项时要运行的 shell。
SUDO_ASKPASS:指定用于读取密码的辅助程序的路径,如果不可用终端或指定了 -A 选项。
SUDO_COMMAND:设置为 sudo 运行的命令,包括所有参数。参数在 4096 个字符处被截断,以防止潜在的执行错误。
SUDO_EDITOR:在 -e(sudoedit)模式下使用的默认编辑器。
SUDO_GID:设置为调用 sudo 的用户的组 ID。
SUDO_HOME:设置为调用 sudo 的用户的家目录。
SUDO_PROMPT:除非指定了 -p 选项,否则用作默认密码提示。
SUDO_PS1:如果设置,则将 PS1 设置为其值,用于正在运行的程序。
SUDO_TTY:如果存在,则设置为调用 sudo 的用户的终端设备。
SUDO_UID:设置为调用 sudo 的用户的用户 ID。
SUDO_USER:设置为调用 sudo 的用户的登录名。
USER:设置为与上述 LOGNAME 相同的值。
VISUAL:如果未设置 SUDO_EDITOR,则在 -e(sudoedit)模式下使用的默认编辑器。
文件
/etc/sudo.conf:sudo 前端配置
示例
以下示例假定配置了正确的安全策略。
要获取无法读取的目录的文件列表: $ sudo ls /usr/local/protected
要列出用户 yaz 的家目录,该用户位于包含 \~yaz 的文件系统上,该文件系统未导出为 root: $ sudo -u yaz ls ~yaz
要以用户 www 的身份编辑 index.html 文件: $ sudoedit -u www ~www/htdocs/index.html
要仅查看只能由 root 用户和 adm 组中的用户访问的系统日志: $ sudo -g adm more /var/log/syslog
要以 jim 用户身份运行编辑器,并使用不同的主组:
$ sudoedit -u jim -g audio ~jim/sound.txt
要关闭机器:
$ sudo shutdown -r +15 "quick reboot"
要列出 /home 分区中所有目录的磁盘使用情况。这些命令在子 shell 中运行,以允许 ‘cd’ 命令和文件重定向正常工作。
$ sudo sh -c "cd /home ; du -s * | sort -rn > USAGE"
诊断信息
sudo 产生的错误消息包括:
editing files in a writable directory is not permitted
默认情况下,如果任何父目录都可以由调用用户写入,sudoedit 不允许编辑文件。这可以避免可能允许用户覆盖任意文件的竞争条件。有关更多信息,请参见 sudoers(5) 中的 sudoedit_checkdir 选项。
editing symbolic links is not permitted
默认情况下,sudoedit 在打开文件时不会跟踪符号链接。有关更多信息,请参见 sudoers(5) 中的 sudoedit_follow 选项。
effective uid is not 0, is sudo installed setuid root?
sudo 未以 root 权限运行。sudo 二进制文件必须由 root 用户拥有,并且必须设置用户 ID 位。此外,它不能位于挂载了“nosuid”选项的文件系统或映射 uid 0 到非特权 uid 的 NFS 文件系统上。
effective uid is not 0, is sudo on a file system with the 'nosuid' option set or an NFS file system without root privileges?
sudo 未以 root 权限运行。sudo 二进制文件具有正确的拥有者和权限,但仍未以 root 权限运行。最常见的原因是,sudo 二进制文件所在的文件系统挂载了“nosuid”选项,或者它是映射 uid 0 到非特权 uid 的 NFS 文件系统。
fatal error, unable to load plugins
在加载或初始化 sudo.conf(5) 中指定的插件时,发生了错误。
invalid environment variable name
通过 -E 选项指定的一个或多个环境变量名包含等号(‘=’)。-E 选项的参数应该是没有关联值的环境变量名。
no password was provided
当 sudo 尝试读取密码时,它没有收到任何字符。这可能会发生在没有可用终端(或指定了 -S 选项)并且标准输入从 /dev/null 重定向时。
a terminal is required to read the password
sudo 需要读取密码,但没有可用的机制来执行此操作。通过 ssh(1) 运行的远程命令默认情况下没有可用的终端;将 -t 选项传递给 ssh(1) 将导致它分配一个终端,这应该允许 sudo 读取密码。要允许 sudo 在没有终端的情况下运行本地命令,可以使用 -S 选项从标准输入读取密码,或者可以配置 askpass 助手,方法是通过 sudo.conf(5) 文件或通过设置 SUDO_ASKPASS 环境变量。
未找到可写的临时目录
sudoedit 无法找到可用于存储其中间文件的可用临时目录。
设置了“无新权限”标志,这会阻止 sudo 以 root 用户身份运行。
sudo 由一个已设置 Linux“无新权限”标志的进程运行。 这会导致在运行可执行文件时忽略设置用户 ID 位,这将阻止 sudo 正常工作。 最可能的原因是在已设置此标志的容器中运行 sudo。 请查看文档,了解是否可以配置容器,使其不设置此标志。
sudo 必须由 uid 0 拥有,并且必须设置 setuid 位
sudo 未以 root 权限运行。 sudo 二进制文件没有正确的拥有者或权限。 它必须由 root 用户拥有,并且必须设置设置用户 ID 位。
sudoedit 在此平台上不受支持
只能在支持设置有效用户 ID 的系统上运行 sudoedit。
读取密码超时
用户在密码超时(默认 5 分钟)之前未输入密码。
您在 passwd 数据库中不存在
您的用户 ID 不显示在系统 passwd 数据库中。
您不得在编辑模式下指定环境变量
只能在运行命令时指定环境变量。 在编辑文件时,编辑器将使用用户未修改的环境运行。
参见
su(1), stat(2), login_cap(3), passwd(5), sudo.conf(5), sudo_plugin(5), sudoers(5), sudoers_timestamp(5), sudoreplay(8), visudo(8)
历史
请参阅 sudo 发行版中的 HISTORY.md 文件(https://www.sudo.ws/about/history/),了解 sudo 的简要历史。
作者
多年来,许多人都参与了 sudo 的开发;此版本主要由以下人员编写代码:
Todd C. Miller
请参阅 sudo 发行版中的 CONTRIBUTORS.md 文件(https://www.sudo.ws/about/contributors/),以获取对 sudo 做出贡献的人员的完整列表。
注意事项
如果允许用户通过 sudo 运行任意命令,则没有简单的方法可以阻止用户获得 root shell。 此外,许多程序(例如编辑器)允许用户通过 shell 转义运行命令,从而绕过 sudo 的检查。 但是,在大多数系统上,可以使用 sudoers(5) 插件的 noexec 功能来防止 shell 转义。
直接通过 sudo 运行“cd”命令没有意义,例如:
$ sudo cd /usr/local/protected
因为当命令退出时,父进程(您的 shell)仍然是相同的。 可以使用 -D 选项在一个特定的目录中运行命令。
通过 sudo 运行 shell 脚本可能会导致与在某些操作系统上使设置用户 ID shell 脚本不安全的相同的内核错误(如果您的操作系统具有 /dev/fd/ 目录,则设置用户 ID shell 脚本通常是安全的)。
错误报告
如果您认为您发现了 sudo 中的错误,您可以选择在 sudo 错误数据库 https://bugzilla.sudo.ws/ 或在 https://github.com/sudo-project/sudo/issues 上提交错误报告。如果您更喜欢使用电子邮件,可以将消息发送到 sudo-workers 邮件列表,https://www.sudo.ws/mailman/listinfo/sudo-workers(公开)或 <_>(私有)。
请勿通过公共 GitHub issue、Bugzilla 或邮件列表报告安全漏洞。相反,请通过电子邮件报告到 <_>。如果您愿意,可以使用在 https://www.sudo.ws/dist/PGPKEYS 找到的 PGP 密钥来加密您的消息。
支持
有限的免费支持可通过 sudo-users 邮件列表获得,请访问 https://www.sudo.ws/mailman/listinfo/sudo-users 订阅或搜索存档。
免责声明
sudo 以“原样”提供,并且不提供任何明示或暗示的保证,包括但不限于适销性和适用于特定用途的暗示保证。请参阅随 sudo 分发的 LICENSE.md 文件或 https://www.sudo.ws/about/license/,以获取完整详细信息。