跳到内容跳到页面导航:上一页 [access key p]/下一页 [access key n]
documentation.suse.com / SUSE Linux Enterprise Server 文档 / 管理指南 / 常用任务 / sudo
适用范围 SUSE Linux Enterprise Server 12 SP5

2 sudo

许多命令和系统实用程序都需要以 root 身份运行才能修改文件和/或执行只有超级用户方能执行的任务。为了确保安全和避免发生意外运行危险命令的情况,通常建议不要直接以 root 身份登录。建议的做法是以非特权的普通用户身份工作,并使用 sudo 命令来运行需要较高特权的命令。

SUSE Linux Enterprise Server 上,sudo 默认配置为与 su 的工作方式类似。但是,sudo 可让用户以高度可配置的方式使用任何其他用户的特权来运行命令。这样,便可为某些用户和组指派具有特定特权的角色。举例来说,可以允许组 users 的成员使用 wilber 的特权运行命令。例如,通过禁止指定任何命令选项,可以进一步限制对命令的权限。虽然 su 始终需要 root 口令才能使用 PAM 进行身份验证,但是您可以将 sudo 配置为使用您自己的身份凭证进行身份验证。这样就不需要共享 root 口令,从而提高了安全性。例如,您可以允许 users 组的成员以 wilber 身份运行 frobnicate 命令,但限制其不能指定自变量。这样,便可为某些用户和组指派具有特定能力的角色。

2.1 sudo 基本用法

虽然 sudo 简单易用,功能却十分强大。

2.1.1 运行单个命令

以普通用户身份登录后,您可以在命令前加上 sudoroot 身份运行任何命令。按照提示输入 root 口令后,如果身份验证成功,您便能以 root 身份运行命令:

tux > id -un1
tux
tux > sudo id -un
root's password:2
root
tux > id -un
tux3
tux > sudo id -un
4
root

1

id -un 命令会打印当前用户的登录名。

2

在输入过程中不会显示口令,无论是明文还是密文均不显示。

3

只有以 sudo 开头的命令才会使用较高的特权运行。如果是不带 sudo 前缀的相同命令,仍会使用当前用户的特权运行。

4

在限定时间内,您无需再次输入 root 口令。

提示
提示:I/O 重定向

I/O 重定向的工作方式与您预期的可能不同:

tux > sudo echo s > /proc/sysrq-trigger
bash: /proc/sysrq-trigger: Permission denied
tux > sudo cat < /proc/1/maps
bash: /proc/1/maps: Permission denied

只有 echo/cat 二进制会使用较高特权运行,重定向则由用户外壳使用用户特权执行。您可以按第 2.1.2 节 “启动外壳”中所述启动外壳,也可以使用 dd 实用程序来启动:

echo s | sudo dd of=/proc/sysrq-trigger
sudo dd if=/proc/1/maps | cat

2.1.2 启动外壳

必须在每条命令前加上 sudo 可能很繁琐。虽然可以将外壳指定为命令 sudo bash,但还是建议您使用以下其中一种内置机制来启动外壳:

sudo -s (<命令>)

启动 SHELL 环境变量所指定的外壳或目标用户的默认外壳。如果给定了命令,则会将该命令传递给外壳(使用 -c 选项),否则外壳会以交互模式运行。

tux:~ > sudo -i
root's password:
root:/home/tux # exit
tux:~ > 
sudo -i (<命令>)

-s 类似,但是会将外壳启动为登录外壳。也就是说,系统会对外壳的启动文件(.profile 等)进行处理,并会将当前的工作目录设置为目标用户的主目录。

tux:~ > sudo -i
root's password:
root:~ # exit
tux:~ > 

2.1.3 环境变量

默认情况下,sudo 不会传播环境变量:

tux > ENVVAR=test env | grep ENVVAR
ENVVAR=test
tux > ENVVAR=test sudo env | grep ENVVAR
root's password:
1
tux > 

1

输出为空即表明在使用 sudo 运行的命令的环境中不存在环境变量 ENVVAR

此行为可通过 env_reset 选项进行更改,请参见表 2.1 “有用的标志和选项”

2.2 配置 sudo

sudo 是一个非常灵活的工具,提供各种配置选项。

注意
注意:无法使用 sudo

如果您不小心将自己锁定在 sudo 之外,则可以使用 su -root 口令来获取 root 外壳。要修复该错误,请运行 visudo

2.2.1 编辑配置文件

sudo 的主要策略配置文件为 /etc/sudoers。如果此文件中存在错误,您可能便会无法进入系统,因此强烈建议您使用 visudo 来编辑配置文件。此举可防止同时更改打开的文件,并会在保存修改之前检查语法错误。

您还可以通过设置 EDITOR 环境变量来使用除 vi 以外的编辑器(不论名字如何),例如:

sudo EDITOR=/usr/bin/nano visudo

不过,/etc/sudoers 文件本身是由系统包提供的,更新时这些修改可能会取消。因此,建议您将自定义配置放到 /etc/sudoers.d/ 目录下的文件中。该目录下的任何文件都会自动纳入系统中。要在该子目录下创建或编辑文件,请运行:

sudo visudo -f /etc/sudoers.d/NAME

或者,使用其他编辑器(例如 nano):

sudo EDITOR=/usr/bin/nano visudo -f /etc/sudoers.d/NAME
注意
注意:/etc/sudoers.d 中忽略的文件

/etc/sudoers 中的 #includedir 命令(用于 /etc/sudoers.d)会忽略以 ~(波浪号)结尾或包含 .(点)的文件。

关于 visudo 命令的详细信息,请运行 man 8 visudo

2.2.2 sudoers 基本配置语法

在 sudoers 配置文件中,有两种类型的选项:字符串和标志。字符串可以包含任何值,而标志则只能在“ON”或“OFF”之间切换。sudoers 配置文件最重要的语法构造为:

# Everything on a line after a # gets ignored 1
Defaults !insults # Disable the insults flag 2
Defaults env_keep += "DISPLAY HOME" # Add DISPLAY and HOME to env_keep
tux ALL = NOPASSWD: /usr/bin/frobnicate, PASSWD: /usr/bin/journalctl 3

1

#include#includedir 这两个普通命令例外。其后跟数字,用于指定 UID。

2

去除 ! 可将指定的标志设置为“ON”。

3

请参见第 2.2.3 节 “sudoers 中的规则”

表 2.1︰ 有用的标志和选项

选项名称

说明

示例

targetpw

此标志控制调用用户是需要输入目标用户(例如 root)的口令 (ON) 还是需要输入调用用户的口令 (OFF)。

Defaults targetpw # Turn targetpw flag ON
rootpw

如果设置了该选项,sudo 将提示输入 root 口令,而非目标用户或调用命令的用户的口令。默认值为 OFF。

Defaults !rootpw # Turn rootpw flag OFF
env_reset

如果设置了该选项,sudo 会构造一个仅包含 TERMPATHHOMEMAILSHELLLOGNAMEUSERUSERNAMESUDO_* 集的最小环境。此外,会从调用环境导入 env_keep 中列出的变量。默认值为“ON”。

Defaults env_reset # Turn env_reset flag ON
env_keep

env_reset 标志设为“ON”时要保留的环境变量列表。

# Set env_keep to contain EDITOR and PROMPT
Defaults env_keep = "EDITOR PROMPT"
Defaults env_keep += "JRE_HOME" # Add JRE_HOME
Defaults env_keep -= "JRE_HOME" # Remove JRE_HOME
env_delete

env_reset 标志设为“OFF”时要去除的环境变量列表。

# Set env_delete to contain EDITOR and PROMPT
Defaults env_delete = "EDITOR PROMPT"
Defaults env_delete += "JRE_HOME" # Add JRE_HOME
Defaults env_delete -= "JRE_HOME" # Remove JRE_HOME

还可以使用 Defaults 令牌为用户、主机和命令集合创建别名。并且,可以仅将选项应用到特定用户集。

关于 /etc/sudoers 配置文件的详细信息,请参见 man 5 sudoers

2.2.3 sudoers 中的规则

sudoers 配置中的规则可能会非常复杂,因此本节仅涉及基本内容。每个规则都遵循基本模式([] 标记的是可选部分):

#Who      Where         As whom      Tag                What
User_List Host_List = [(User_List)] [NOPASSWD:|PASSWD:] Cmnd_List
sudoers 规则的语法
User_List

一个或多个(用 , 分隔)标识符:用户名、格式为 %GROUPNAME 的组或格式为 #UID 的用户 ID。可以使用 ! 前缀来取反。

Host_List

一个或多个(用 , 分隔)标识符:(完全限定的)主机名或 IP 地址。可以使用 ! 前缀来取反。Host_List 的惯常选项为 ALL

NOPASSWD:|PASSWD:

如果用户在 NOPASSWD: 后面运行的命令与 CMDSPEC 匹配,系统不会提示用户输入口令。

PASSWD 为默认选项,仅当两个选项位于同一行时才需要指定它:

tux ALL = PASSWD: /usr/bin/foo, NOPASSWD: /usr/bin/bar
Cmnd_List

一个或多个(用 , 分隔)区分符:可执行文件的路径,后跟允许使用的自变量或什么也不跟。

/usr/bin/foo     # Anything allowed
/usr/bin/foo bar # Only "/usr/bin/foo bar" allowed
/usr/bin/foo ""  # No arguments allowed

ALL 可以用作 User_ListHost_ListCmnd_List

允许 tux 在无需输入口令的情况下以 root 身份运行所有命令的规则:

tux ALL = NOPASSWD: ALL

允许 tux 运行 systemctl restart apache2 的规则:

tux ALL = /usr/bin/systemctl restart apache2

允许 tux 在不带自变量的情况下以 admin 身份运行 wall 的规则:

tux ALL = (admin) /usr/bin/wall ""
警告
警告:危险构造

以下类型的构造

ALL ALL = ALL

在没有 Defaults targetpw 的情况下切勿使用,否则任何人都能以 root 身份运行命令。

2.3 常见使用情况

尽管默认配置对于简单的设置和桌面环境通常已经够用,但是自定义配置非常有用。

2.3.1 在无需 root 口令的情况下使用 sudo

在具有特殊限制(用户 X 只能以 root 身份运行命令 Y)的情况下,无法实现此目的。在其他情况下,还是建议进行某种分隔。按照惯例,组 wheel 的成员能以 root 身份运行所有带有 sudo 的命令。

  1. 将自己添加到 wheel

    如果您自己的用户帐户尚不是 wheel 组的成员,请添加该帐户,具体做法是运行 sudo usermod -a -G wheel 用户名然后注销并再次登录。运行 groups 用户名以确认更改是否成功。

  2. 将使用调用用户的口令进行身份验证的选项设为默认设置。

    使用 visudo 创建文件 /etc/sudoers.d/userpw(请参见第 2.2.1 节 “编辑配置文件”)并添加:

    Defaults !targetpw
  3. 选择新默认规则。

    根据是否想要用户重新输入口令,取消对 /etc/sudoers 中特定行的注释,并将默认规则注释掉。

    ## Uncomment to allow members of group wheel to execute any command
    # %wheel ALL=(ALL) ALL
    
    ## Same thing without a password
    # %wheel ALL=(ALL) NOPASSWD: ALL
  4. 提高默认规则的限制性

    /etc/sudoers 中允许一切操作的规则注释掉或去除:

    ALL     ALL=(ALL) ALL   # WARNING! Only use this together with 'Defaults targetpw'!
    警告
    警告:sudoers 中的危险规则

    切勿漏掉这一步,否则任何用户都能以 root 身份执行任何命令。

  5. 测试配置

    尝试以 wheel 的成员和非成员身份运行 sudo

    tux:~ > groups
    users wheel
    tux:~ > sudo id -un
    tux's password:
    root
    wilber:~ > groups
    users
    wilber:~ > sudo id -un
    wilber is not in the sudoers file.  This incident will be reported.

2.3.2 对 X.Org 应用程序使用 sudo

在使用 sudo 启动图形应用程序时,可能会出现以下错误:

tux > sudo xterm
xterm: Xt error: Can't open display: %s
xterm: DISPLAY is not set

YaST 会选择 ncurses 界面而非图形界面。

要在通过 sudo 启动的应用程序中使用 X.Org,需要传播环境变量 DISPLAYXAUTHORITY。要进行此项配置,请创建文件 /etc/sudoers.d/xorg(请参见第 2.2.1 节 “编辑配置文件”)并添加下面一行:

Defaults env_keep += "DISPLAY XAUTHORITY"

如尚未设置 XAUTHORITY 变量,请按如下方式设置:

export XAUTHORITY=~/.Xauthority

现在,X.Org 应用程序便可正常运行:

sudo yast2

2.4 更多信息

使用 sudo --help 可检索有关可用命令行开关的简要概述。如需说明和其他重要信息,请参见手册页:man 8 sudo,配置相关信息详见 man 5 sudoers