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

2 sudo 基础知识

运行某些命令需要 root 特权。但是,出于安全原因及避免出错考虑,我们不建议以 root 身份登录。更安全的做法是先以普通用户身份登录,再使用 sudo 以提升的特权来运行命令。

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

2.1 sudo 基本用法

以下章节将会介绍 sudo 的基本用法。

2.1.1 运行单个命令

作为普通的用户,您可以在命令前加上 sudo 来以 root 身份运行任何命令。系统会提示您提供 root 口令。如果身份验证成功,便会以 root 身份运行命令:

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

1

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

2

在输入过程中不会显示口令,无论是明文还是屏蔽字符都不显示。

3

只有以 sudo 开头的命令才会以提升的特权运行。

4

提升的特权会持续一段时间,因此您不必再次提供 root 口令。

提示
提示:I/O 重定向

使用 sudo 时,I/O 重定向不起作用:

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

在上面的示例中,只有 echocat 命令才以提升的特权运行。重定向将由用户的外壳以用户特权执行。要以提升的特权执行重定向,请根据第 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 (<command>)

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

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

-s 类似,但会作为登录外壳启动外壳。这表示系统会处理该外壳的启动文件(.profile 等),并会将当前的工作目录设置为目标用户的主目录。

tux:~ > sudo -i
root's password:
root:~ # exit
tux:~ > 
提示
提示:环境变量

默认情况下,sudo 不会传播环境变量。可以使用 env_reset 选项更改此行为(请参见有用的标志和选项)。

2.2 配置 sudo

sudo 提供各种可配置的选项。

注意
注意:无法使用 sudo

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

2.2.1 编辑配置文件

sudo 的主要策略配置文件为 /etc/sudoers。如果该文件的格式错误,您可能会无法进入系统,因此强烈建议您使用 visudo 来进行编辑。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 指令会忽略以 ~(波浪线)字符结尾或包含 .(点)字符的文件。

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

2.2.2 sudoers 基本配置语法

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

# Everything on a line after # is 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 是普通命令。

2

去除 ! 字符会将所需标志设置为 ON。

3

请参见第 2.2.3 节 “基本 sudoers 规则”

有用的标志和选项
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 规则

每条规则都遵循以下模式([] 标记的是可选部分):

#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: 后面运行的命令与 Cmd_List 匹配,系统不会提示用户输入口令。

PASSWD 为默认选项。仅当 PASSWDNOPASSWD 位于同一行时,才需要指定此选项:

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 身份运行命令。

重要
重要:Winbind 和 sudo

sudoers 文件中指定组名时,请确保使用 NetBIOS 域名而不是领域,例如:

%DOMAIN\\GROUP_NAME ALL = (ALL) ALL

请注意,使用 winbindd 时,其格式还取决于 smb.conf 文件中的 winbind separator 选项。默认为 \.例如,如果将其更改为 +,则 sudoers 文件中的帐户格式必须为 DOMAIN+GROUP_NAME

2.3 sudo 使用案例

虽然默认配置适用于标准的使用方案,您仍可以根据特定需求自定义默认配置。

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

根据设计,组 wheel 的成员能以 root 身份运行所有带有 sudo 的命令。下面的过程介绍如何将用户帐户添加到 wheel 组。

  1. 校验 wheel 组是否存在:

    > getent group wheel

    如果之前的命令未返回任何结果,请安装会创建 wheel 组的 system-group-wheel 软件包:

    > sudo zypper install system-group-wheel
  2. 将您的用户帐户添加到 wheel 组。

    如果您的用户帐户还不是 wheel 组的成员,请使用 sudo usermod -a -G wheel USERNAME 命令添加。注销然后重新登录即可启用更改。运行 groups USERNAME 命令以校验更改是否成功。

  3. 使用用户帐户的普通口令进行身份验证。

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

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

    根据是否希望用户重新输入口令,在 /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
  5. 提高默认规则的限制性.

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

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

    请勿跳过此步骤。否则任何用户都能以 root 身份执行任何命令!

  6. 测试配置.

    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 启动图形应用程序通常会导致以下错误:

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

一种简单的解决方法是使用 xhost 来暂时允许 root 用户访问本地用户的 X 会话。可使用以下命令完成此操作:

xhost si:localuser:root

以下命令可去除授予的访问权限:

xhost -si:localuser:root
警告
警告:潜在安全问题

以 root 特权运行图形应用程序存在安全隐患。建议仅在例外的情况下,才启用对图形应用程序的 root 访问权限。另外,建议在关闭图形应用程序后,立即撤消授予的 root 访问权限。

2.4 更多信息

sudo --help 命令提供可用命令行选项的简要概述,而 man sudoers 命令则会提供有关 sudoers 及其配置的详细信息。