sudo, sudoedit

以超级用户或其他用户的身份运行命令


语法格式

sudo -h | -K | -k | -L | -V
sudo -v [-AknS] [-p prompt]
sudo -l [-AknS] [-g group] [-p prompt] [-U user] [-u user] [cmd]
sudo [-AbEHknPS] [-C fd] [-g group] [-p prompt] [-r role] [-t type]
[-u user] [var=value] [-i|-s [cmd]]
sudo -e [-AknS] [-r role] [-t type] [-C fd] [-g group] [-p prompt]
[-u user] files
sudoedit [-AnS] [-C fd] [-g group] [-p prompt] [-u user] files

命令简介

sudo命令允许用户以超级用户或/etc/sudoers文件中指定的其他用户的身份运行指定命令cmd。设置真实和有效用户ID与用户组ID,以匹配/etc/passwd文件中指定的目标用户和/etc/group文件中指定的用户组(除非指定了“-P”选项)。如果调用者是超级用户,或目标用户与调用者是同一用户,则无须提供密码。否则,sudo通常要求用户提供密码进行认证。注意,按照默认的配置,这里所谓的密码认证指的是用户的密码,不是超级用户的密码。

一旦获得认证,立即更新/var/run/sudo目录中的用户时间记录。在之后的短时间内(5分钟,除非sudoers文件中另有设定),用户可以随时运行sudo命令而不必提供密码。

sudo与sudoedit是一个程序两个名字。运行sudoedit命令,相当于运行“sudo -e”命令。sudoedit命令主要用于编辑/etc/sudoers文件,参见“-e”选项的说明。

通过查询/etc/sudoers文件,sudo可以确定谁是授权的用户。在直接运行“sudo -v”命令时,用户可以更新时间记录。如果在5分钟之内用户没有提供密码,密码提示本身也会超时。

如果sudoers文件中未指定的用户试图利用sudo运行特权命令,sudo将会按照配置时的定义或sudoers文件中的设置,给适当的权威用户(默认为超级用户)发一封邮件。注意,如果未授权的用户尝试使用“-l”或“-v”选项运行sudo命令,不会发邮件。这允许用户确定自己是否授权使用sudo命令。

此外,在sudo命令中,可以采用“var=value”的形式设置环境变量,把设定的环境变量传递给命令行中指定的命令。

命令选项

-A  如果需要密码,sudo通常会读取当前终端。如果指定了“-A”选项,sudo将会调用一个辅助程序(如对话框),读取用户输入的密码。如果设置了SUDO_ASKPASS环境变量,可以使用其中指定的辅助程序。否则,使用sudoers文件中askpass参数的值作为辅助程序。

-b  后台运行。以后台方式运行指定的命令。注意,如果使用“-b”选项运行后台作业,不能使用Shell的作业控制命令操作相应的进程。

-C fd  关闭文件描述符。除了标准输入、标准输出和标准错误输出之外,sudo通常会关闭已打开的所有文件描述符。利用“-C”选项,可以指定一个大于标准错误输出的文件描述符起点,如文件描述符3,表示需要关闭的文件描述符的下限。注意,指定的文件描述符fd不能小于3。仅当已经启用了sudoers文件中的closefrom_override参数,才能使用这个选项。

-e  编辑。这个选项用于编辑指定的一个或多个文件,而非运行命令。相当于直接运行sudoedit命令,编辑/etc/sudoers文件。如果当前用户有权编辑sudoers文件,其运行过程如下:

1. 利用原始文件创建一个能够编辑的临时文件(把文件的属主设置为运行命令的用户)。

2. 调用SUDO_EDITOR、VISUAL或EDITOR变量指定的编辑器,编辑临时文件。如果上述环境变量均未设置,使用sudoers文件中editor变量枚举的第一个程序作为编辑器。

3. 如果修改了临时文件,把其中的内容复制到原始文件,删除临时文件。

如果指定的文件不存在,创建同名的文件。注意,与sudo运行的大多数命令不同,sudo运行的编辑器是在未加修改的调用者的环境中运行的。由于某些原因,如果sudo无法保存编辑的文件,用户将会收到一条警告信息,同时把编辑的副本保存在一个临时文件中。

-E  保持环境。“-E”选项用于抵消sudoers文件中的env_reset参数,保持当前的环境不变。仅当匹配的命令具有SETENV标记,或sudoers文件中的setenv参数已经设置时,这个选项才有意义。

-g group  通常,sudo将会把运行命令的用户(默认为超级用户)的主用户组设置成passwd文件指定的用户组。表示sudo使用设定的用户组作为主用户组运行指定的命令。若想使用用户组ID替代用户组名,可以使用“#gid”的形式指定用户组ID。在指定用户组ID运行命令时,许多Shell要求在“#”符号前增加转义符号“\”。如果未指定“-u”选项,则以调用者的用户身份(并非超级用户)运行命令。不管是否指定了“-u”选项,均使用指定的用户组设置主用户组。

-H  按照passwd文件中指定的目标用户(默认为超级用户)的主目录设置HOME环境变量。通常,sudo并不修改HOME变量(参见sudoers(5)手册页中set_home与always_set_home参数的说明)。

-i [cmd]  仿真初始注册。调用passwd文件中目标用户的Shell作为注册Shell,正如初始注册一样,读取并执行用户主目录中诸如.bash_profile等用户初始化文件。如果指定了命令参数cmd,把命令传递给Shell执行。否则,直接进入交互Shell环境。在开始运行Shell之前,sudo首先尝试进入用户的主目录,初始化工作环境,保持DISPLAY与TERM变量不变,设置HOME、SHELL、USER、LOGNAME与PATH变量, 以及/etc/environment文件。删除其他的所有环境变量。

-k  把用户运行sudo命令的时间设置成UNIX纪元时间,从而终结用户运行sudo命令不提供密码的时间。当再次运行sudo命令时,要求用户提供密码。但无论何时,使用这个选项运行sudo命令不需要提供密码。当与命令行中的命令一起使用时,或与一个要求提供密码的选项一起使用时,“-k”选项将导致sudo忽略用户的时间文件。最终结果是,sudo将会提示用户提供密码,但不会更新用户的时间文件。

-K  类似于“-k”选项,但将完全删除用户的时间记录,而且也不能与命令行中的命令或其他选项一起使用。使用这个选项运行sudo命令时,不需要提供密码。

-l [cmd]  如果未指定命令参数cmd,“-l”选项能够列出当前用户(或“-U”选项指定的用户)在当前主机系统中能够执行或禁止执行的命令。如果指定了命令参数cmd,且sudoers文件允许执行,显示命令的完整路径名及任何命令行选项与参数。如果指定的命令不允许执行,sudo将会终止运行,返回结束状态1。如果指定了“-ll”选项,或指定了多个“-l”选项,则采用长格式显示输出数据。

-L  显示参数的默认值。利用这个选项,可以列出Defaults参数行中能够设置的参数,同时给出每个参数的简单说明。与grep命令一起使用时,这个选项是非常有用的。

-n  非交互模式。利用这个选项,能够防止sudo命令提示用户输入密码。如果运行的命令需要提供密码,sudo将会显示一条错误信息,然后终止运行。

-P  表示sudo将会保持调用者的用户组向量不做任何修改。通常,sudo会初始化用户组向量,使之包含目标用户所属的一系列用户组。但仍然会设置真实和有效的用户组ID,使之匹配目标用户。

-p prompt  使用指定的提示信息取代默认的密码输入提示。在定制提示信息时,可以使用下列百分号格式字符:

%H  表示本地系统的规范域名(如果本地系统的主机名是规范域名,或sudoers文件中的fqdn选项已经设置)。

%h  表示本地系统的主机名(不包括域名)。

%p  表示输入哪个用户的密码(参见sudoers文件中rootpw、targetpw 与runaspw选项的设置)。

%U  表示以哪一个用户身份运行命令的用户名(默认为超级用户)。

%u  表示调用者的用户名。

%%  表示引入一个百分号。

“-p”选项指定提示信息将取代系统默认的密码提示,除非已经禁用了sudoers文件中的passprompt_override参数。

-r role  表示新的SELinux安全属性具有指定的角色role

-S  这个选项令sudo从(重定向的)标准输入而非终端设备读取密码。密码之后必须有一个换行符。

-s [cmd]  交互Shell运行模式。利用这个选项,可以运行SHELL环境变量指定的Shell。如果SHELL变量未设置,则运行passwd文件中指定的Shell。如果指定了命令参数cmd,把指定的命令传递给Shell执行。否则,直接进入交互Shell环境。

-t type  表示新的SELinux安全属性具有指定的类型type。如果未指定类型,默认的类型源于“-r”选项指定的角色。

-U user  与“-l”选项一起使用时,用于列出指定用户在当前主机中的特权。只有超级用户或在当前主机中具有sudo ALL特权的用户才能使用这个选项。

-u user  以指定用户而非超级用户的身份运行指定的命令。也可以使用“#uid”的形式指定用户ID。在指定用户ID运行命令时,许多Shell要求在“#”符号前增加转义符号“\”。注意,如果sudoers文件中的targetpw参数已经设置,则不能使用passwd文件中未定义的用户ID运行命令。

-v  如果指定了这个选项,sudo将会更新用户的时间信息,必要时提示用户输入密码。利用这个选项,可以延长sudo命令的超时值,即增加5分钟(或sudoers文件中设置的其他时间量)不需要提供密码即可运行特权命令的时间,但不运行命令。

--  终止处理选项标志。这个选项表示应停止处理命令行选项及其参数。最适合与“-s”选项一起使用。

-h  显示命令的用法等帮助信息,然后退出。

-V  显示命令的版本信息,然后退出。如果调用者已经是超级用户,“-V”选项还会输出一系列编译的sudo默认值以及系统的本地网络地址等。

应用实例

1. 使用sudo命令显示系统保护的目录。

$ sudo ls -l /var/spool/cron

2. 模拟su命令,直接进入超级用户环境。在完成所有的管理任务之后再退出。

$ sudo -i

$ sudo -s

3. 重新启动系统。

$ sudo shutdown -r now

索引:A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z