UNPKG

arch-wiki-md-repo

Version:

All arch-wiki articles in markdown format, updated every two days.

335 lines (199 loc) 11.3 kB
相关文章 * [Users and Groups (简体中文)](/index.php/Users_and_Groups_(%E7%AE%80%E4%BD%93%E4%B8%AD%E6%96%87) "Users and Groups (简体中文)") * [su](/index.php/Su "Su") **翻译状态:** 本文是英文页面 [Sudo](/index.php/Sudo "Sudo") 的[翻译](/index.php/ArchWiki_Translation_Team_(%E7%AE%80%E4%BD%93%E4%B8%AD%E6%96%87) "ArchWiki Translation Team (简体中文)"),最后翻译时间:2016-06-13,点击[这里](https://wiki.archlinux.org/index.php?title=Sudo&diff=0&oldid=437107)可以查看翻译后英文页面的改动。 [sudo](http://www.gratisoft.us/sudo/)(substitute user do) 使得系统管理员可以授权特定用户或用户组作为 root 或他用户执行某些(或所有)命令,同时还能够对命令及其参数提供审核跟踪。 用户可以选择用 [su](/index.php/Su "Su") 切换到 root 用户运行命令,但是这种方式会启动一个 root shell 并允许用户运行之后的所有的命令。而 sudo 可以针对单个命令、仅在需要时授予临时权限,减少因为执行错误命令损坏系统的可能性。sudo 也能以其他用户身份执行命令并且记录用户执行的命令,以及失败的权限申请。 ## Contents * [1 安装](#.E5.AE.89.E8.A3.85) * [2 使用](#.E4.BD.BF.E7.94.A8) * [3 配置](#.E9.85.8D.E7.BD.AE) * [3.1 查看当前设置](#.E6.9F.A5.E7.9C.8B.E5.BD.93.E5.89.8D.E8.AE.BE.E7.BD.AE) * [3.2 使用 visudo](#.E4.BD.BF.E7.94.A8_visudo) * [3.3 设置示例](#.E8.AE.BE.E7.BD.AE.E7.A4.BA.E4.BE.8B) * [3.4 sudoers文件默认权限](#sudoers.E6.96.87.E4.BB.B6.E9.BB.98.E8.AE.A4.E6.9D.83.E9.99.90) * [3.5 密码过期时间](#.E5.AF.86.E7.A0.81.E8.BF.87.E6.9C.9F.E6.97.B6.E9.97.B4) * [4 使用技巧](#.E4.BD.BF.E7.94.A8.E6.8A.80.E5.B7.A7) * [4.1 bash 自动补全支持](#bash_.E8.87.AA.E5.8A.A8.E8.A1.A5.E5.85.A8.E6.94.AF.E6.8C.81) * [4.2 跨终端sudo](#.E8.B7.A8.E7.BB.88.E7.AB.AFsudo) * [4.3 环境变量](#.E7.8E.AF.E5.A2.83.E5.8F.98.E9.87.8F) * [4.4 传递命令别名](#.E4.BC.A0.E9.80.92.E5.91.BD.E4.BB.A4.E5.88.AB.E5.90.8D) * [4.5 使用root密码](#.E4.BD.BF.E7.94.A8root.E5.AF.86.E7.A0.81) * [4.6 禁止root登陆](#.E7.A6.81.E6.AD.A2root.E7.99.BB.E9.99.86) * [4.6.1 gksu](#gksu) * [4.6.2 kdesu](#kdesu) * [4.7 让 sudo 使用 /etc/sudoers.d 中的文件](#.E8.AE.A9_sudo_.E4.BD.BF.E7.94.A8_.2Fetc.2Fsudoers.d_.E4.B8.AD.E7.9A.84.E6.96.87.E4.BB.B6) * [5 疑难解答](#.E7.96.91.E9.9A.BE.E8.A7.A3.E7.AD.94) * [5.1 SSH TTY 问题](#SSH_TTY_.E9.97.AE.E9.A2.98) * [5.2 权限 Umask](#.E6.9D.83.E9.99.90_Umask) * [5.3 默认 skeleton 文件](#.E9.BB.98.E8.AE.A4_skeleton_.E6.96.87.E4.BB.B6) ## 安装 [安装](/index.php/%E5%AE%89%E8%A3%85 "安装")软件包 [sudo](https://www.archlinux.org/packages/?name=sudo)。 ## 使用 在配置之前,普通用户还无法使用sudo。所以请认真阅读配置部分。 普通用户只需在命令前加上`sudo`,即可使用 root 特权执行命令: ``` $ sudo *cmd* ``` 参见:[sudo 手册](http://www.gratisoft.us/sudo/man/sudo.html)。 ## 配置 有关配置和密码过期等问题的更多信息,请阅读 [man sudoers](http://www.sudo.ws/man/1.8.13/sudoers.man.html)。 ### 查看当前设置 命令 `sudo -ll` 可以显示当前的 sudo 配置; 命令 `sudo -lU *user*` 可以查看某个特定用户的设置。 ### 使用 visudo sudo的配置文件是`/etc/sudoers``visudo`会锁住`sudoers`文件,保存修改到临时文件,然后检查文件格式,确保正确后才会覆盖`sudoers`文件。必须保证`sudoers`格式正确,否则sudo将无法运行。 **警告:** `/etc/sudoers`格式错误会导致sudo不可用。**必须**使用`visudo`编辑该文件防止出错。 `visudo`调用的默认编辑器是`vi`。官方仓库里的 sudo 编译时开启了`--with-env-editor`,会采用环境变量 `VISUAL``EDITOR`的设置。如果设置了`VISUAL` 就不会使用`EDITOR`。 如果要临时使用其他编辑器,在该命令前加上`EDITOR`环境变量即可。例如,要使用 `nano`,用root运行以下命令: ``` # EDITOR=nano visudo ``` 要永久设置编辑器,请查看 [定义本地环境变量](/index.php/Environment_variables#Defining_variables "Environment variables"). 系统级的设置可以把编辑器设置到 `/etc/sudoers`。以 `nano` 为例,使用`visudo`打开该文件,加入以下内容: ``` # Defaults specification # Reset environment by default Defaults env_reset # Set default EDITOR to vim, and do not allow visudo to use EDITOR/VISUAL. Defaults editor=/usr/bin/nano, !env_editor ``` ### 设置示例 要为某个用户可以执行所有命令,在配置文件中加入: ``` 用户名 ALL=(ALL) ALL ``` 如果只想允许以某个主机名登录用户执行命令: ``` 用户名 主机名=(ALL) ALL ``` 允许wheel[用户组](/index.php/Groups_(%E7%AE%80%E4%BD%93%E4%B8%AD%E6%96%87) "Groups (简体中文)")成员无密码使用sudo: ``` %wheel ALL=(ALL) NOPASSWD: ALL ``` 要不询问某个用户的密码: ``` Defaults:USER_NAME  !authenticate ``` 只为用户启用部分命令的执行权限: ``` 用户名 主机名=/sbin/halt,/sbin/poweroff,/sbin/reboot,/usr/bin/pacman -Syu ``` **注意:** 最后的设置会覆盖前面的设置,所以限定多的配置应该放到配置文件的后面。 只为某个主机名登录用户启用部分命令的执行权限,不用输入密码: ``` USER_NAME HOST_NAME= NOPASSWD: /usr/bin/halt,/usr/bin/poweroff,/usr/bin/reboot,/usr/bin/pacman -Syu ``` 更详细的`sudoers`范例,参见[本页](http://www.gratisoft.us/sudo/sample.sudoers)。此外,更多信息参见:[sudoers 手册](http://www.gratisoft.us/sudo/man/sudoers.html)。 ### sudoers文件默认权限 sudoers文件的属主和属组ID必须都是0,文件权限位是0440(-r--r-----)。如果你不小心改变了默认权限,应当立即恢复它们: ``` # chown -c root:root /etc/sudoers # chmod -c 0440 /etc/sudoers ``` ### 密码过期时间 用户可以修改sudo记录密码的时间。使用`visudo`命令将如下内容加入`/etc/sudoers```` Defaults:用户名 timestamp_timeout=20 ``` 对该用户,sudo将记录密码20分钟。时间值也可以是小数。 **提示:** 如果timestamp_timeout设置为0,sudo总是询问密码。 ## 使用技巧 ### bash 自动补全支持 详情参见:[bash (简体中文)#自动命令补全](/index.php/Bash_(%E7%AE%80%E4%BD%93%E4%B8%AD%E6%96%87)#.E8.87.AA.E5.8A.A8.E5.91.BD.E4.BB.A4.E8.A1.A5.E5.85.A8 "Bash (简体中文)")。 ### 跨终端sudo **警告:** 此举使得所有进程都使用同一个sudo任务。 如果不想每次启动新终端都重新输入密码,在配置文件中禁止**tty_tickets**即可: ``` Defaults !tty_tickets ``` ### 环境变量 当前用户的环境变量不会应用到sudo启动的程序,除非使用`-E`选项: ``` $ sudo -E pacman -Syu ``` 如果经常需要这样做,可以在`~/.bashrc`(或其他shell配置文件)中加入命令别名: ``` alias sudo="sudo -E" ````/etc/sudoers`中添加以下内容作用相同: ``` Defaults !env_reset ``` 可以把需要传递环境变量的命令设置到`env_keep```` Defaults env_keep += "ftp_proxy http_proxy https_proxy no_proxy" ``` ### 传递命令别名 当前用户的命令别名不会应用到sudo。如果需要这样,只需在`~/.bashrc`或者`/etc/bash.bashrc`中加入: ``` alias sudo='sudo ' ``` ### 使用root密码 默认sudo询问用户密码。添加`targetpw``rootpw`到配置文件的“Defaults”部分,可以让sudo询问root密码: ``` Defaults targetpw ``` 可以限定特定的组使用 root 密码: ``` Defaults:%wheel targetpw %wheel ALL=(ALL) ALL ``` ### 禁止root登陆 **警告:** ArchLinux用户最好不要禁用root用户,出问题就麻烦大了。 有了sudo,用户也许希望禁止使用root登陆。没有了root用户,黑客就不知道管理员账户的名字了。 **警告:** 务必在禁用root**之前**配置好其他用户的权限! 使用`passwd`命令锁住root用户: ``` # passwd -l root ``` 下列命令解锁root用户: ``` $ sudo passwd -u root ``` 或者,编辑`/etc/shadow`文件,将root的加密口令列替换为“!”: ``` root:!:12345:::::: ``` 要再次启用sudo,重新设置其密码即可: ``` $ sudo passwd root ``` #### gksu 要设置 *gksu* 使用 sudo 而不是 root: ``` $ gconftool-2 --set --type boolean /apps/gksu/sudo-mode true ``` #### kdesu KDE下常用 kdesu 以 root 权限执行图形程序。默认情况下,即使root账户被禁用,kdesu仍会尝试使用su切换root。需要配置kdesu以使用sudo,创建/编辑`~/.config/kdesurc` (KDE4 的 `~/.kde4/share/config/kdesurc`),加入: ``` [super-user-command] super-user-command=sudo ``` 或者使用下面命令,KDE 4 使用 kwriteconfig ``` $ kwriteconfig5 --file kdesurc --group super-user-command --key super-user-command sudo ``` ### 让 sudo 使用 /etc/sudoers.d 中的文件 *sudo* 可以解析 `/etc/sudoers.d/` 目录中的文件,这样就不需要编辑单一的 `/etc/sudoers` 文件,可以单独修改一个设置然后放入此目录。目录中配置的格式和 `/etc/sudoers`一样, 优点包括: * 不需要编辑 {ic|sudoers.pacnew}} 文件; * 如果新配置有问题,可以删除这个文件而不用编辑 `/etc/sudoers`. `/etc/sudoers.d/` 目录中的文件是按字母顺序加载的,`.``~` 开头的文件会被跳过。文件名应该以双字母开头,例如 `01_foo`,请注意配置文件的顺序以避免相互覆盖。 ## 疑难解答 ### SSH TTY 问题 远程执行命令时,SSH默认不会分配tty。没有tty,sudo就无法在获取密码时关闭回显。使用`-tt`选项强制SSH分配tty(使用两次`-tt`)。 另一方面,sudoers中的`Defaults`选项`requiretty`要求只有拥有tty的用户才能使用sudo。可以通过`visudo`编辑配置文件,禁用这个选项: ``` # Disable "ssh hostname sudo <cmd>", because it will show the password in clear text. # You have to run "ssh -t hostname sudo <cmd>". # # Defaults requiretty ``` ### 权限 Umask Sudo 会统一用户的 [umask](/index.php/Umask "Umask") 值和它自己的 umask (默认是 0022)。这会阻止 sudo 创建比该用户的 umask 允许的打开权限更多的文件。这默认是合理的,因为没有使用自定义 umask。但是这可能导致用sudo运行一个命令和root运行一个命令建立的文件权限不同。如果这导致了问题,sudo 提供了一个方法来修复 umask,即使想要的 umask 比用户指定的 umask 权限还要多。添加下面内容 (使用 `visudo`) 会覆盖 sudo 的默认行为: ``` Defaults umask = 0022 Defaults umask_override ``` 这会将 sudo 的 umask 设置为 root 的默认 umask (0022),覆盖掉默认行为,无论用户的umask设置成什么都会使用这里设定的值。 ### 默认 skeleton 文件 [此页面](http://www.sudo.ws/sudo/sudoers.man.html#x5355444f455253204f5054494f4e53) 列出了所有可用配置。