sudo
sudo允许用户以超级用户或安全策略指定的另一个用户的身份执行命令。Sudo支持安全策略插件和输入/输出日志的插件。第三方可以开发和分发自己的策略和I/O日志插件,以便与sudo前端无缝地工作。默认的安全策略是sudoers,它是通过文件/etc/sudoers或通过LDAP配置的。
安全策略确定用户在需要什么权利的时候需要运行sudo。该策略可能要求用户使用密码或其他身份验证机制进行身份验证。如果需要身份验证,如果用户的密码未在可配置的时限内输入,sudo将退出。此限制是特定于策略的;sudoers安全策略的默认密码提示超时为5分钟。
安全策略可能支持凭据缓存,允许用户在不需要身份验证的情况下再次运行sudo。sudoers策略将凭据缓存5分钟,除非在sudoers(5)中重写。通过使用“-v”选项运行sudo,用户可以在不运行命令的情况下更新缓存的凭据。
安全策略可能记录使用sudo的成功和失败情况。如果配置了I/O插件,运行中的命令的输入和输出也可能被记录下来。
此命令的适用范围:RedHat、RHEL、Ubuntu、CentOS、SUSE、openSUSE、Fedora。
1、语法
sudo -h | -K | -k | -V
sudo -v [-AknS] [-g group name | #gid] [-p prompt] [-u user name | #uid]
sudo -l[l] [-AknS] [-g group name | #gid] [-p prompt] [-U user name] [-u user name | #uid] [command]
sudo [-AbEHnPS] [-C fd] [-g group name | #gid] [-p prompt] [-r role] [-t type] [-u user name | #uid] [VAR=value] -i | -s [command]
sudoedit [-AnS] [-C fd] [-g group name | #gid] [-p prompt] [-u user name | #uid] file ...
2、选项列表
选项 |
说明 |
-h |
帮助信息 |
-V |
显示命令版本信息 |
-A |
通常,如果sudo需要密码,它就会从用户终端读取密码。如果指定了-A(Askpass)选项,则执行一个(可能是Graphi cal)帮助程序来读取用户密码并将密码输出到标准输出。如果设置了SUDO_ASKPASS环境变量,则指定助手程序的路径。否则,如果“/etc/sudo.conf”包含了askpass程序的路径,将使用该值。例如: # Path to askpass helper program Path askpass /usr/X11R6/bin/ssh-askpass |
-b |
在后台运行命令。请注意,如果使用-b选项,则不能使用shell作业控件操作进程。大多数交互命令在后台模式下都无法正常工作。 |
-C fd |
通常,sudo将关闭除标准输入、标准输出和标准错误之外的所有打开的文件描述符。“-C”选项允许用户在标准错误(文件描述符3)之上指定起点。不允许值小于3。安全策略可能限制用户使用“-C”选项的能力。sudoers策略仅允许用户只有在开启“closefrom_override”之后,才可以使用“-C”选项 |
-E |
运行时保留用户环境。“-E”选项向安全策略指示用户希望保存他们现有的环境变量。如果指定了“-E”选项,且用户没有保留环境的权限,则安全策略可能返回错误 |
-e |
编辑命令文件,而不是执行命令。当查询安全策略的时候,使用字符串“sudoedit”代替命令。如果用户通过策略认证,有3个步骤需要做:1)产生一个临时的副本;2)运行策略指定的编辑器来编辑临时文件。sudoers策略依次使用环境变量SUDO_EDITOR,、VISUAL 、EDITOR。如果没有设置这三个环境变量,则使用编辑器sudoers(5)选项中列出的第一个程序;3)如果修改了临时文件,则将临时文件复制回原来的位置,并移除临时版本。 如果指定的文件不存在,它将被创建。注意,与sudo运行的大多数命令不同,编辑器是在调用用户的环境中运行的。如果由于某些原因,sudo无法用指定的编辑器更新文件,则用户将收到警告,编辑后的副本将保留在临时文件中。 |
-g group |
由指定的用户组来执行命令。使用#gid,而不是组名。注意,shell要求使用反斜杠(‘\’)转义‘#’ |
-H |
-H(Home)选项要求安全策略将“HOME”环境变量设置为由密码数据库指定的目标用户的家目录。根据策略,这个选项很可能是默认的。 |
-i [command] |
模拟初始登录。“-i“选项将目标用户的密码数据库条目指定的shell作为登录shell运行。这意味着shell将读取特定于登录的资源文件,如“.profile”或“.login”。如果指定了命令,则通过shell的-c选项将其传递给shell执行。如果未指定命令,则执行交互式shell。sudo试图在运行shell之前更改到该用户的家目录。安全策略应将环境初始化为最小变量集,类似于用户登录时存在的变量集。 |
-K |
删除用户缓存的凭据,不能与命令或其他选项一起使用。此选项不需要密码。并非所有安全策略都支持凭据缓存。 |
-k [command] |
单独使用时,sudo选项可以使用户的缓存凭据无效。下一次运行sudo时,将需要密码。此选项不需要密码,添加该选项是为了允许用户从.logout文件中撤消sudo权限。并非所有安全策略都支持凭据缓存。 当与可能需要密码的命令或选项一起使用时,“-k”选项将导致sudo忽略用户的缓存凭据。因此,sudo将提示输入密码(如果安全策略需要密码),并且不会更新用户缓存的凭据。 |
-l[l] [command] |
列出用户能执行的命令。如果没有指定命令,则-l(List)选项将列出当前主机上调用用户(或-u选项指定的用户)所允许的命令。如果指定了命令并得到安全策略的允许,则会显示命令的完全路径以及任何命令行参数。如果指定了命令但不允许执行,sudo将退出,状态值为1。如果使用l参数(即-ll),则使用较长的列表格式。 |
-n |
非交互式,将不提示用户。-n选项防止sudo提示用户输入密码。如果运行命令需要密码,sudo将显示错误消息并退出。 |
-P |
保存组向量。“-P“选项使sudo保持调用用户的组向量不变。默认情况下,sudoers策略将组向量初始化为目标用户所在的组列表。然而,实际有效的组ID仍然被设置为与目标用户匹配。 |
-p prompt |
使用指定的密码提示语句: %H,扩展为主机名,包括域名; %h,扩展为主机名,不包括域名; %p,扩展为请求其密码的用户的名称; %U,扩展到运行命令的用户的登录名; %u,扩展到调用用户的登录名; %%,两个连续的‘%’字符折叠成一个‘%’字符; |
-r role |
“-r“选项将导致新的安全上下文具有由role指定的角色。 |
-S |
从标准输入读取密码,而不是终端获取。密码后面必须跟着换行符 |
-s [command] |
如果设置了shell环境变量,则“-s“选项运行由shell环境变量指定的shell,或者运行密码数据库中指定的shell。如果指定了命令,则通过shell的”-c“选项将命令传递给shell执行。如果没有指定命令,则执行交互式shell。 |
-t type |
“-t“选项将导致新的安全上下文的类型,如果没有指定类型,则从指定的角色派生默认类型。 |
-U user |
“-U”选项与“-l”选项一起使用,以列出指定用户的权限。安全策略可能限制列出其他用户的特权。sudoers策略只允许root或当前主机上具有完整特权的用户使用此选项。 |
-u user |
以指定的用户身份执行指令。“-u“选项使sudo以root以外的用户身份运行指定的命令。要指定#uid而不是用户名。当以uid的形式运行命令时,许多shell要求用反斜杠‘\’转义“#”。安全策略可能会将UID限制在密码数据库。sudoers策略允许不存在于密码数据库中的UID,只要没有设置targetpw选项。其他安全策略可能不支持这一点。 |
-v |
当给定-v(验证)选项时,sudo将更新用户的缓存凭据,必要时对用户密码进行身份验证。对于sudoers插件,这会将sudo超时再延长5分钟(或安全策略设置的超时时间),但不会运行命令 |
-- |
这个选项提示,sudo应该停止处理命令行参数 |
为命令设置的环境变量也可以var=value的形式传递到命令行,例如LD_Library_path=/usr/local/pkg/lib。传递到命令行的变量受与正常环境变量相同的限制,但有一个重要的例外。如果在sudoers中设置setenv选项,则要运行的命令具有SETENV标记集或匹配的命令。
3、执行命令
当sudo执行命令时,安全策略指定命令的执行环境。通常,将实际有效的uid和gid设置为与密码数据库中指定的目标用户相匹配,并根据组数据库初始化组向量(除非指定了-p选项)。安全策略可能会指定一些参数:真实有效用户ID、真实有效组ID、补充组ID、环境列表、当前工作目录、文件创建掩码、SELinux的角色和类型、调度级别。
1)进程模型
当sudo运行一个命令时,它调用fork(2),设置上面描述的执行环境,并在子进程中调用execve系统调用。主sudo进程等待命令完成,然后将命令的退出状态传递给安全策略的close方法并退出。如果配置了I/O日志插件,则将一个新的伪终端((“pty”)被创建,第二个sudo进程用于在用户现有的pty和正在运行的新pty之间传递作业控制信号。这个额外的进程使挂起并恢复命令成为可能。如果没有它,命令将使用POSIX术语中的“孤立进程组”。也不会收到任何作业控制信号
2)信号处理
因为命令是作为sudo进程的子进程运行的,所以sudo会将接收到的信号中继到命令。除非该命令在新的pty中运行,否则SIGHUP、SIGINT和SIGQUIT信号将不会被中继,除非它们是由用户进程而不是内核发送的。否则,该命令将在用户按下“ctrl+c”时接收到两次SIGINT.信号。由于SIGSTOP和SIGKILL不能被捕获,因此不会被中继到命令。作为一般规则,当您希望挂起sudo运行的命令时,应该使用SIGTSTP而不是SIGSTOP。
作为特例,sudo将不会中继它正在运行的命令发送的信号。这可以防止命令意外地杀死自己。在某些系统上,reboot(8)命令在重新启动系统之前将SIGTERM发送到所有非系统进程,而不是它自己。这防止sudo将接收到的SIGTERM信号中继回reboot(8),然后该信号可能会在系统实际启动之前退出,使其处于类似于单用户模式的半死状态。但是,请注意,此检查只适用于sudo运行的命令,而不适用于命令可能创建的任何其他进程。因此,通过sudo运行调用重reboot(8)或shutdown(8)的脚本可能导致系统处于这种未定义状态,除非使用exec()函数系列而不是system()运行reboot(8)或shutdown(8)(后者在命令和调用进程之间插入一个shell)。
4、插件
插件根据“/etc/sudo.conf”文件的内容动态加载。如果没有“/etc/sudo.conf”文件,或者它不包含插件行,sudo将使用传统sudoers安全策略和I/O日志记录,这相当于以下“/etc/sudo.conf”文件
|
插件行由插件关键字组成,后面跟着符号名字和包含插件的共享对象的路径。符号名字是插件共享对象中struct policy_plugin或struct io_plugin的名称。路径可以是完全限定的或相对的。如果不完全限定,则相对于“/usr/libexec”目录。路径之后的任何附加参数都是作为参数传递给插件的开放函数。不以Plugin、Path、Debug、Set开头的行将被默认忽略。
5、路径
路径行由Path关键字组成,后面跟着要设置的路径的名称及其值。例:
Path noexec /usr/libexec/sudo_noexec.so Path askpass /usr/X11R6/bin/ssh-askpass |
以下与插件无关的路径可以在“/etc/sudo.conf”文件中设置
1)askpass,辅助程序的完全限定路径,用于在没有终端可用时读取用户的密码。当sudo从图形应用程序执行时,情况可能是这样。由askpass指定的程序应该将传递给它的参数显示为提示符,并将用户的密码写入标准输出。askpass可能被环境变量SUDO_ASKPASS覆盖。
2)noexec,共享库的完全限定路径,包含仅返回错误的execv()、execve()和fexecve()库函数的虚拟版本,用于在支持LD_PRELOAD或其等效的系统上实现noexec功能。默认值为“/usr/libexec/sudo_noexec.so”。
6、调试标志
Sudo版本1.8.4及更高版本支持一种灵活的调试框架,如果存在问题,可以帮助跟踪sudo在内部做什么。
Debug行由Debug关键字组成,后面跟着要调试的程序名称(sudo、visudo、sudoreplay)、调试文件名和以逗号分隔的调试标志列表。sudo和sudoers插件使用的调试标志语法是subsystem@priority,但是插件可以*使用不同的格式,只要它不包括逗号。例如语句“Debug sudo /var/log/sudo_debug all@warn,plugin@info”将会在警告级别和更高级别记录插件子系统的所有调试语句以及信息级别的语句。
目前,每个程序只支持一个调试条目。sudo调试条目由sudo前端、sudodit和plugins共享。将来的版本可能会增加对每个插件调试行的支持和/或对单个程序的多个调试文件的支持。
sudo前端使用的优先级依次为:crit、err、warn、notice、diag、info、trace、debug.。当指定每个优先级时,还包括所有高于此优先级的优先级。例如,通知的优先级将包括记录在通知中的调试消息以及更高的优先级。
sudo前端可以使用一下子系统:
子系统 |
说明 |
all |
所有的子系统。 |
args |
命令行参数进程。 |
conv |
用户回会话 |
edit |
sudoedit。 |
exec |
命令执行过程。 |
main |
sudo的主函数。 |
netif |
网络接口处理。 |
pcomm |
插件会话 |
plugin |
插件配置。 |
pty |
为tty相关代码。 |
selinux |
SELinux专用处理。 |
util |
实用函数。 |
utmp |
utmp处理 |
7、退出值
当程序成功执行时,sudo的退出状态将只是被执行的程序的退出状态。否则,如果存在配置/权限问题或sudo无法执行给定的命令,sudo将以1退出。在后一种情况下,错误字符串将打印到标准错误。如果sudo无法在用户路径中调用stat函数统计一个或多个条目,则在stderr上打印错误。(如果该目录不存在,或者它实际上不是一个目录,则忽略该条目,并且不打印错误。)在正常情况下不应该发生这种情况。stat(2)返回“拒绝权限”的最常见原因是,如果您正在运行一个自动侦听器,并且您的路径中的一个目录位于当前无法访问的计算机上。
8、安全说明
当执行外部命令时,sudo试图保持安全。为了防止命令欺骗,sudo在用户路径中搜索命令时,最后检查“.”和““。但是请注意,实际的path环境变量没有被修改,而是不改变地传递给sudo执行的程序。
请注意,sudo通常只记录它显式运行的命令。如果用户运行“sudo su“或”sudo sh“之类的命令,则从该shell运行的后续命令不受sudo的安全策略的约束,提供shell转义的命令也是如此。如果启用了I/O日志记录,随后的命令将有它们的输入和输出记录,但这些命令不会有传统的日志。因此,当用户通过sudo访问命令时,必须小心,以验证该命令不会无意中给用户一个有效的root shell。
为了防止泄露潜在的敏感信息,sudo在执行时默认禁用核心转储。为了帮助调试sudo崩溃,您可能希望通过在“/etc/sudo.conf“文件中将“disable_coredump”设置为false来重新启用核心转储,如下所示
Set disable_coredump false
请注意,默认情况下,大多数操作系统从setuid程序(包括sudo)禁用核心转储。要实际获得sudo核心文件,您可能需要为setuid进程启用核心转储。在BSD和Linux系统上,这是通过“sysctl“命令完成的,在Solaris上可以使用”coreadm“命令。
9、环境变量
sudo使用一下环境变量,安全策略控制命令环境的实际内容。
环境变量 |
说明 |
EDITOR |
如果没有设置SUDO_EDITOR或VISUAL,则默认编辑器使用”-e”模式。 |
|
在“-i“模式中或在sudoers中启用env_reset时,将其设置为目标用户的邮件线轴。 |
HOME |
如果指定了“-i“或”-H“,在sudoers中赋值给目标用户的home目录,或者赋值给env_reset或all_set_home。或者当指定”-s“选项时,sudoers中赋值给set_home。 |
PATH |
可能被安全策略覆盖 |
SEHLL |
使用“-s“选项,执行运行的shell |
SUDO_ASKPASS |
如果没有可用的终端,或者指定了“-A“选项,则指定用于读取密码的辅助程序的路径。 |
SUDO_COMMAND |
赋值给sudo运行的命令 |
SUDO_EDITOR |
“-e“模式下的默认编辑器 |
SUDO_GID |
赋值给调用sudo的用户的组ID |
SUDO_PROMPT |
作为默认的密码提示语句 |
SUDO_PS1 |
如果设置,PS1将被设置为正在运行的程序的值。 |
SUDO_UID |
赋值给调用sudo的用户的ID |
SUDO_USER |
赋值给调用sudo的用户登录名 |
USER |
赋值给目标用户(默认是root,除非指定“-u“选项) |
VISUAL |
如果在“-e“模式下没有指定”SUDO_EDITOR“,那么这个就是默认编辑器 |
10、实例
1)查看当前用户支持的指令
|
2)以指定的用户身份来执行命令,不可以指定root
|
3)其他例子代码
|