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 运行单个命令 #
    以普通用户身份登录后,您可以在命令前加上 sudo 以 root 身份运行任何命令。按照提示输入 root 口令后,如果身份验证成功,您便能以 root 身份运行命令:
   
tux >id -un1 tuxtux >sudo id -unroot's password:2 roottux >id -untux3tux >sudo id -un4 root
| 
 | |
| 在输入过程中不会显示口令,无论是明文还是密文均不显示。 | |
| 
      只有以  | |
| 
      在限定时间内,您无需再次输入  | 
I/O 重定向的工作方式与您预期的可能不同:
tux >sudo echo s > /proc/sysrq-trigger bash: /proc/sysrq-trigger: Permission deniedtux >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=testtux >ENVVAR=test sudo env | grep ENVVAR root's password: 1tux >
| 
      输出为空即表明在使用  | 
    此行为可通过 env_reset 选项进行更改,请参见表 2.1 “有用的标志和选项”。
   
2.2 配置 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
| 
 | |
| 
      去除  | |
| 选项名称 | 说明 | 示例 | 
|---|---|---|
| targetpw | 
         此标志控制调用用户是需要输入目标用户(例如  | Defaults targetpw # Turn targetpw flag ON | 
| rootpw | 
         如果设置了该选项, | Defaults !rootpw # Turn rootpw flag OFF | 
| env_reset | 
         如果设置了该选项, | Defaults env_reset # Turn env_reset flag ON | 
| env_keep | 
 | # 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 | 
 | # 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
- 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_List、Host_List 和 Cmnd_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 的命令。
   
- 将自己添加到 - wheel组- 如果您自己的用户帐户尚不是 - wheel组的成员,请添加该帐户,具体做法是运行- sudo usermod -a -G wheel 用户名然后注销并再次登录。运行- groups 用户名以确认更改是否成功。
- 将使用调用用户的口令进行身份验证的选项设为默认设置。 - 使用 - visudo创建文件- /etc/sudoers.d/userpw(请参见第 2.2.1 节 “编辑配置文件”)并添加:- Defaults !targetpw 
- 选择新默认规则。 - 根据是否想要用户重新输入口令,取消对 - /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 
- 提高默认规则的限制性 - 将 - /etc/sudoers中允许一切操作的规则注释掉或去除:- ALL ALL=(ALL) ALL # WARNING! Only use this together with 'Defaults targetpw'! 警告:sudoers 中的危险规则- 切勿漏掉这一步,否则任何用户都能以 - root身份执行任何命令。
- 测试配置 - 尝试以 - 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 setYaST 会选择 ncurses 界面而非图形界面。
    要在通过 sudo 启动的应用程序中使用 X.Org,需要传播环境变量 DISPLAY 和 XAUTHORITY。要进行此项配置,请创建文件 /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。