以其他用户身份执行命令
命令语法格式
sudo -h | -K | -k | -V
sudo -v [-AknS] [-a type] [-g group] [-h host] [-p prompt] [-u user]
sudo -l [-AknS] [-a type] [-g group] [-h host] [-p prompt] [-U user] [-u user] [command]
sudo [-AbEHnPS] [-a type] [-C num] [-c class] [-g group] [-h host] [-p prompt] [-r role] [-t type] [-u user] [VAR=value] [-i | -s] [command]
sudoedit [-AknS] [-a type] [-C num] [-c class] [-g group] [-h host] [-p prompt] [-u user] file …
命令描述
命令sudo允许被许可的用户以超级用户或其他用户的身份执行命令,如由安全策略所指定的。调用sudo的用户的“真实用户ID”(非有效用户ID)用于确定用户名,并使用该用户名查询安全策略。
命令sudo支持插件体系结构,用于安全策略和输入/输出日志记录的。第三方可以开发和分发自己的策略和I/O日志插件,以便与sudo前端无缝协作。默认安全策略是sudoers,它通过/etc/sudoers或LDAP进行配置。有关更多信息,请参阅「插件」部分。
安全策略确定用户运行sudo时具有的权限(如果有)。该策略可能要求用户使用密码或其他身份验证机制对自身进行身份验证。如果需要身份验证,如果未在可配置的时间限制内输入用户密码,则sudo将退出。此限制是特定于策略的;对于sudoers安全策略,默认密码提示超时是不受限制的。
安全策略可以支持凭证缓存,以允许用户在一段时间内不需要身份验证的情况下可再次运行sudo命令。对于sudoers策略,它会将凭证缓存15分钟,除非在sudoers(5)中被覆盖。通过使用-v选项运行sudo,用户可以在不运行命令的情况下更新缓存的凭据。
安全策略可能会记录使用sudo的成功和失败尝试。如果配置了I/O插件,则也可以记录运行命令的输入和输出。
当作为sudoedit调用时,隐含-e选项(如下所述)。
命令行选项
-u user, –user=user
以默认目标用户(通常为root)以外的用户身份运行该命令。 用户可以是用户名或以“#”字符为前缀的数字用户ID(UID)(例如,对于0可表示为UID #0)。当将命令作为UID运行时,许多Shell要求使用反斜杠(’\’)转义’#’。某些安全策略可能会将UID限制为密码数据库中列出的UID。 只要未设置targetpw选项,sudoers策略就允许不在密码数据库中的UID。 其他安全策略可能不支持此功能。
-g group, –group=group
运行命令,将主组设置为group,而不是目标用户的密码数据库条目指定的主组。 该group可以是组名称或以“#”为前缀的数字组ID(GID)(例如,对于“0”则为“GID #0”)。 当作为GID运行命令时,许多Shell要求使用反斜杠(’\’)转义’#’。 如果未指定-u选项,则该命令将作为调用用户运行。 在任何一种情况下,主要组都将设置为group。
-P, –preserve-groups
保持调用用户的组向量不变。 默认情况下,sudoers策略会将组向量初始化为目标用户所属的组列表。 但是,真实组ID和有效组ID仍设置为与目标用户匹配。
-A, –askpass
通常,如果sudo需要密码,它将从用户的终端读取它。 如果指定了-A(askpass)选项,则执行(可能是图形化的)帮助程序以读取用户的密码并将密码输出到标准输出。 如果设置了SUDO_ASKPASS环境变量,则它指定辅助程序的路径。 否则,如果sudo.conf(5)包含指定辅助程序的行,则将使用该值。 例如:
Path askpass /usr/X11R6/bin/ssh-askpass
如果没有可用的辅助程序,sudo将退出并显示错误。
-b, –background
在后台运行给定的命令。 请注意,无法使用Shell作业控制来操作sudo启动的后台进程。 大多数交互式命令无法在后台模式下正常工作。
-C num, –close-from=num
在执行命令之前,请关闭所有大于或等于num的文件描述符。 不允许使用小于3的值。 默认情况下,执行命令时,sudo将关闭除标准输入、标准输出、标准错误之外的所有打开文件描述符。 安全策略可能会限制用户使用此选项的能力。 当管理员启用了closefrom_override选项时,sudoers策略才允许使用-C选项。
-E, –preserve-env
向安全策略指示用户希望保留其现有环境变量。 如果用户没有保留环境的权限,则安全策略可能会返回错误。
-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无法使用其编辑版本更新文件,则用户将收到警告,编辑后的副本将保留在临时文件中。
-H, –set-home
请求安全策略将HOME环境变量设置为目标用户的密码数据库条目指定的主目录。根据策略,这可能是默认行为。
-s, –shell
运行SHELL环境变量指定的Shell(如果已设置),或由调用用户的密码数据库条目指定的Shell。如果指定了一个命令,它将通过Shell的-c选项传递给Shell执行。如果未指定任何命令,则执行交互式Shell。
-h host, –host=host
如果安全策略插件支持远程命令,请在指定主机上运行该命令。 请注意,sudoers插件当前不支持运行远程命令。 这也可以与-l选项一起使用,以列出用户对远程主机的权限。
-i, –login
将目标用户的密码数据库条目指定的Shell作为登录Shell运行。 这意味着Shell将读取特定于登录的资源文件,如.profile或.login。 如果指定了一个命令,它将通过Shell的-c选项传递给Shell执行。 如果未指定任何命令,则执行交互式Shell。在运行Shell之前,sudo尝试更改为该用户的主目录。 该命令的运行环境类似于用户在登录时收到的环境。sodoers(5)手册中的「命令环境」部分记录了:当正在使用sudoers策略时,选项-i如何影响运行命令的环境。
-K, –remove-timestamp
与-k选项类似,不同之处在于它完全删除用户的缓存凭据,并且不能与命令或其他选项一起使用。 此选项不需要密码。 并非所有安全策略都支持凭据缓存。
-k, –reset-timestamp
在没有命令的情况下使用时,会使用户的缓存凭据无效。 换句话说,下次运行sudo时将需要密码。 此选项不需要密码,并且已添加以允许用户从.logout文件撤消sudo权限。
与可能需要密码的命令或选项一起使用时,此选项将导致sudo忽略用户的缓存凭据。 因此,sudo将提示输入密码(如果安全策略需要密码),并且不会更新用户的缓存凭据。
并非所有安全策略都支持凭据缓存。
-l, –list
如果未指定任何命令,请在当前主机上列出调用用户(或-U选项指定的用户)的允许(和禁止)命令。 如果多次指定此选项,并且安全策略支持详细输出格式,则使用较长的列表格式。
如果指定了命令并且安全策略允许该命令,则会显示该命令的完全限定路径以及任何命令行参数。 如果指定了command但不允许,则sudo将以状态值“1”退出。
-U user, –other-user=user
与-l选项一起使用可列出用户的权限,而不是用于调用用户的权限。 安全策略可能会限制列出其他用户的权限。 sudoers策略仅允许root或具有当前主机上ALL权限的用户使用此选项。
-n, –non-interactive
避免提示用户输入任何类型。 如果命令运行需要密码,sudo将显示错误消息并退出。
-p prompt, –prompt=prompt
使用带有可选转义序列的自定义密码提示。 sudoers策略支持以下百分比(’%’)转义序列:
%h 扩展为没有域名的本地主机名
%p 扩展为正在被请求密码的用户名(遵循sudoers(5)中的rootpw,targetpw和runaspw标志)
%U 扩展为将运行该命令的用户的登录名(默认为root,除非还指定了-u选项)
%u 扩展为调用用户的登录名
%% 两个连续’%’字符解析为为单个’%’字符
除非在sudoers中禁用了passprompt_override标志,否则自定义提示将覆盖支持PAM的系统上的系统密码提示。
-r role, –role=role
使用包含指定角色的SELinux安全上下文运行该命令。
-S, –stdin
将提示写入标准错误,并从标准输入读取密码,而不是使用终端设备。 密码必须后跟换行符。
-t type, –type=type
使用包含指定类型的SELinux安全上下文运行该命令。 如果未指定类型,则默认类型派生自角色。
-v, –validate
更新用户的缓存凭据,必要时对用户进行身份验证。 对于sudoers插件,默认情况下,这会将sudo超时延长15分钟,但不会运行命令。 并非所有安全策略都支持缓存凭据。
—
选项–表示sudo应该停止处理命令行参数。
其他选项
-h, –help
显示帮助信息并退出。
-V, –version
打印sudo版本字符串,以及安全策略插件和任何I/O插件的版本字符串。如果调用用户已经是root用户,则-V选项将显示在构建sudo时传递给configure的参数,并且插件可能会显示更详细的信息,例如默认选项。
注意事项
为命令设置的环境变量也可以以VAR=value的形式在命令行上传递,例如,LD_LIBRARY_PATH=/usr/local/pkg/lib。在命令行上传递的变量受安全策略插件强加的限制。 sudoers策略目标变量在命令行上传递给与普通环境变量相同的限制,但有一个重要的例外。 如果在sudoers中设置了setenv选项,则要运行的命令设置了SETENV标记或匹配的命令为ALL,用户可以设置,否则将被禁止的变量。 有关更多信息,请参阅sudoers(5)。
命令执行
当sudo执行命令时,安全策略指定命令的执行环境。 通常,“实际用户ID和组ID”以及“有效用户和组ID”设置为与密码数据库中指定的目标用户的匹配,并且基于组数据库初始化组向量(除非指定了-P选项)。
安全策略可以指定以下参数:
真实有效的组ID
补充组ID
环境变量列表
当前工作目录
文件创建模式掩码(umask)
SELinux角色和类型
调度优先级(又名nice值)
以上参数。
Process model
当sudo运行命令时,它调用fork(2),如上所述设置执行环境,并在子进程中调用execve系统调用。主sudo进程等待命令完成,然后将命令的退出状态传递给安全策略的close函数并退出。如果配置了I/O日志插件或安全策略明确请求它,则会创建一个新的伪终端(“pty”),并使用第二个sudo进程在“用户现有的pty”和“命令正在运行新的pty”之间中继作业控制信号。这个额外的进程使得例如可以暂停和恢复命令成为可能。没有它,该命令将在POSIX中称为“孤立进程组”,并且它将不会接收任何作业控制信号。作为特殊情况,如果策略插件没有定义close函数并且不需要pty,则sudo将直接执行命令而不是首先调用fork(2)。 sudoers策略插件仅在启用I/O日志记录,需要pty或启用pam_session或pam_setcred选项时定义close函数。请注意,在使用PAM的系统上默认启用pam_session和pam_setcred。
Signal handling
当命令作为sudo进程的子进程运行时,sudo会将收到的信号中继到命令。 SIGINT和SIGQUIT信号仅在命令以新pty运行或信号由用户进程而非内核发送时才被中继。这可以防止命令在每次用户输入control-C时接收SIGINT两次。某些信号(如SIGSTOP和SIGKILL)无法捕获,因此不会被中继到命令中。作为一般规则,当您希望暂停由sudo运行的命令时,应使用SIGTSTP而不是SIGSTOP。
作为一种特殊情况,sudo不会中继由其运行的命令发送的信号。这可以防止命令意外地自杀。在某些系统上,reboot(8)命令会在重新引导系统之前将SIGTERM发送到除自身以外的所有非系统进程。这可以防止sudo将收到的SIGTERM信号转发回reboot(8),然后可能在系统实际重启之前退出,使其处于类似于单用户模式的半死状态。但请注意,此检查仅适用于由sudo运行的命令,而不适用于该命令可能创建的任何其他进程。因此,运行通过sudo调用reboot(8)或shutdown(8)的脚本可能导致系统以此未定义状态结束,除非使用exec()系列运行reboot(8)或shutdown(8)函数而不是system()(在命令和调用进程之间插入一个shell)。
如果没有加载I/O日志插件并且策略插件没有定义close()函数,设置命令超时或要求命令在新的pty中运行,sudo可以直接执行命令而不是将其作为子进程。
Plugins
插件可以通过sudo.conf(5)文件中的Plugin指令指定。 它们可以作为动态共享对象加载(在支持它们的系统上),也可以直接编译到sudo二进制文件中。 如果没有sudo.conf(5)文件,或者它不包含插件行,sudo将使用传统的sudoers安全策略和I/O日志记录。 有关sudo插件体系结构的更多信息,请参阅sudo.conf(5)手册以获取/etc/sudo.conf文件和sudo_plugin(8)手册的详细信息。
注意事项
如果允许该用户通过sudo运行任意命令,则没有简单的方法可以阻止用户获得root shell。 此外,许多程序(如编辑器)允许用户通过shell转义运行命令,从而避免sudo的检查。 但是,在大多数系统上,可以使用sudoers(5)插件的noexec功能来防止shell转义。
通过sudo直接运行cd命令没有意义,例如,
因为当命令退出父进程(你的shell)时仍然是相同的。 有关更多信息,请参阅“示例”部分。
通过sudo运行shell脚本可能会暴露相同的内核BUG,使得setuid的Shell脚本在某些操作系统上不安全(如果您的操作系统有/dev/fd/目录,则setuid的Shell脚本通常是安全的)。
SECURITY NOTES
命令sudo在执行外部命令时尝试安全。
为了防止命令欺骗,当在用户的PATH中搜索命令时(如果一个或两个都在PATH中),sudo检查“.”和“”(都表示当前目录),则“”最后。但请注意,实际的PATH环境变量未被修改,并且不会更改地传递给sudo执行的程序。
永远不应授予用户sudo权限来执行用户可写或驻留在用户可写的目录中的文件。如果用户可以修改或替换命令,则无法限制可以运行的其他命令。
请注意,sudo通常只会记录它显式运行的命令。如果用户运行sudo su或sudo sh等命令,则从该shell运行的后续命令不受sudo安全策略的约束。对于提供shell转义的命令(包括大多数编辑器)也是如此。如果启用了I/O日志记录,则后续命令将记录其输入和/或输出,但这些命令不会有传统日志。因此,在通过sudo授予用户访问命令时必须小心,以验证命令不会无意中为用户提供有效的root shell。有关更多信息,请参阅sudoers中的防止shell转义部分(5)。
为了防止泄露潜在的敏感信息,sudo在执行时默认禁用核心转储(为运行的命令重新启用它们)。这种历史实践可以追溯到大多数操作系统默认允许setuid进程转储核心的时间。为了帮助调试sudo崩溃,您可能希望通过在sudo.conf(5)文件中将“disable_coredump”设置为false来重新启用核心转储,如下所示:
有关更多信息,请参见sudo.conf(5)手册。
相关环境变量
sudo使用以下环境变量。安全策略可以控制命令环境的实际内容。
SUDO_EDITOR
在-e(sudoedit)模式下使用的默认编辑器。
VISUAL
如果未设置SUDO_EDITOR,则在-e(sudoedit)模式下使用默认编辑器。
EDITOR
如果既未设置SUDO_EDITOR,也未设置VISUAL,则在-e(sudoedit)模式下使用的默认编辑器。
MAIL
当指定-i选项或在sudoers中启用env_reset时,设置为目标用户的邮件目录(除非MAIL存在于env_keep列表中)。
HOME
指定-i或-H选项时,当指定-s选项并在sudoers中设置set_home,在sudoers中启用always_set_home时,或者在sudoers中启用env_reset时,设置为目标用户的主目录HOME不在env_keep列表中。
LOGNAME
当指定-i选项,在sudoers中启用set_logname选项或在sudoers中启用env_reset选项时(除非env_keep列表中存在LOGNAME),设置为目标用户的登录名。
PATH
可能会被安全策略覆盖。
SHELL
用于确定要使用-s选项运行的shell。
SUDO_ASKPASS
指定在没有可用终端或指定-A选项时用于读取密码的帮助程序的路径。
SUDO_COMMAND
设置为sudo运行的命令。
SUDO_GID
设置为调用sudo的用户的组ID。
SUDO_PROMPT
用作默认密码提示。
SUDO_PS1
如果设置,PS1将被设置为正在运行的程序的值。
SUDO_UID
设置为调用sudo的用户的用户标识。
SUDO_USER
设置为调用sudo的用户的登录名。
USER
设置为与LOGNAME相同的值,如上所述。
USERNAME
与USER相同。
相关文件
/etc/sudo.conf
命令sudo的前端配置文件。
退出状态
成功执行命令后,sudo的退出状态将是已执行程序的退出状态。 如果命令由于接收到信号而终止,则sudo将自己发送终止命令的信号。
否则,如果存在配置/权限问题或者sudo无法执行给定命令,则sudo将以值1退出。 在后一种情况下,错误字符串将打印到标准错误。 如果sudo不能在用户的PATH中stat(2)一个或多个条目,则会在标准错误中输出错误。 (如果目录不存在或者它实际上不是目录,则忽略该条目并且不会打印错误。)在正常情况下不应该发生这种情况。 stat(2)返回“权限被拒绝”的最常见原因是,如果您正在运行自动挂载程序,并且PATH中的某个目录位于当前无法访问的计算机上。
使用示例
注意:以下示例假定已正确配置的安全策略。
要获取不可读目录的文件列表:
要在不以root用户身份导出~yaz文件系统的机器上列出用户yaz的主目录:
要以用户www编辑index.html文件:
要查看只有root用户和adm组中的用户可访问的系统日志:
要将编辑器作为jim与不同的主要组一起运行:
要关闭机器:
在/home分区中创建目录的用法列表。 请注意,这会在子shell中运行命令以使cd和文件重定向工作。
如上示例。
相关手册
su(1), stat(2), passwd(5), sudo.conf(5), sudoers(5), sudo_plugin(8), sudoreplay(8), visudo(8)
参考文献
- man 8 sudo, Version 1.8.19p1-1
更新日志
- 10/24/2018 创建文章