Sudo (简体中文)
sudo(substitute user do) 使得系统管理员可以授权特定用户或用户组作为 root 或他用户执行某些(或所有)命令,同时还能够对命令及其参数提供审核跟踪。
合理性
用户也可以通过su切换到root用户运行命令。然而与su的启动一个root shell允许用户运行之后的所有的命令不同,sudo可以针对单个命令授予临时权限。sudo仅在需要时授予用户权限,减少了用户因为错误执行命令损坏系统的可能性。sudo也可以用来以其他用户身份执行命令。此外,sudo可以记录用户执行的命令,以及失败的特权获取。
安装
从官方源中安装软件包 sudo。在配置之前,普通用户还无法使用sudo。所以请认真阅读配置部分。
使用
普通用户只需在命令前加上sudo
,即可使用root(或其他用户)特权执行命令:
$ sudo pacman -Syu
参见:sudo 手册。
配置
查看当前设置
命令 sudo -ll
可以显示当前的 sudo 配置。
使用 visudo
sudo的配置文件是/etc/sudoers
。visudo
会锁住sudoers
文件,保存修改到临时文件,然后检查文件格式,确保正确后才会覆盖sudoers
文件。必须保证sudoers
格式正确,否则sudo将无法运行。
visudo
调用的默认编辑器是vi
。官方仓库里的 sudo 编译时开启了--with-env-editor
,会采用环境变量 VISUAL
和 EDITOR
的设置。如果设置了VISUAL
就不会使用EDITOR
。
如果要临时使用其他编辑器,在该命令前加上EDITOR
环境变量即可。例如,要使用 nano
,用root运行以下命令:
# EDITOR=nano visudo
要永久设置编辑器,请查看 定义本地环境变量.
系统级的设置可以把编辑器设置到 /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用户组成员无密码使用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
范例,参见本页。此外,更多信息参见:sudoers 手册。
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分钟。时间值也可以是小数。
使用技巧
sudoers 范例
该配置针对使用终端复用器(screen、tmux或者ratpoison):
/etc/sudoers
Cmnd_Alias WHEELER = /usr/sbin/lsof, /bin/nice, /bin/ps, /usr/bin/top, /usr/local/bin/nano, /usr/sbin/ss, /usr/bin/locate, /usr/bin/find, /usr/bin/rsync Cmnd_Alias PROCESSES = /bin/nice, /bin/kill, /usr/bin/nice, /usr/bin/ionice, /usr/bin/top, /usr/bin/kill, /usr/bin/killall, /usr/bin/ps, /usr/bin/pkill Cmnd_Alias EDITS = /usr/bin/vim, /usr/bin/nano, /usr/bin/cat, /usr/bin/vi Cmnd_Alias ARCHLINUX = /usr/sbin/gparted, /usr/bin/pacman root ALL = (ALL) ALL yourusename ALL = (ALL) ALL, NOPASSWD: WHEELER, NOPASSWD: PROCESSES, NOPASSWD: ARCHLINUX, NOPASSWD: EDITS Defaults !requiretty, !tty_tickets, !umask Defaults visiblepw, path_info, insults, lecture=always Defaults loglinelen = 0, logfile =/var/log/sudo.log, log_year, log_host, syslog=auth Defaults mailto=webmaster@foobar.com, mail_badpass, mail_no_user, mail_no_perms Defaults passwd_tries = 8, passwd_timeout = 1 Defaults env_reset, always_set_home, set_home, set_logname Defaults !env_editor, editor="/usr/bin/vim:/usr/bin/vi:/usr/bin/nano" Defaults timestamp_timeout=360 Defaults passprompt="Sudo invoked by [%u] on [%H] - Cmd run as %U - Password for user %p:"
bash 自动补全支持
详情参见:bash#Auto-completion。
跨终端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 '
扯淡
用户输入密码不正确时,sudo会提示“Sorry, try again.”。在配置文件的“Defaults”部分加入以下内容,会得到更有趣的错误提示:
#Defaults specification Defaults insults
输入sudo -K
清空密码缓存,然后测试。
使用root密码
默认sudo询问用户密码。添加targetpw
或 rootpw
到配置文件的“Defaults”部分,可以让sudo询问root密码:
Defaults targetpw
可以限定特定的组使用 root 密码:
Defaults:%wheel targetpw %wheel ALL=(ALL) ALL
禁止root登陆
有了sudo,用户也许希望禁止使用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权限执行GUI程序。默认情况下,即使root账户被禁用,kdesu仍会尝试使用su切换root。需要配置kdesu以使用sudo,创建/编辑/usr/share/config/kdesurc
加入:
[super-user-command] super-user-command=sudo
让 sudo 使用 /etc/sudoers.d 中的文件
sudo 可以解析 /etc/sudoers.d/
目录中的文件,这样就不需要编辑单一的 /etc/sudoers
文件,可以单独修改一个设置然后放入此目录。目录中配置的格式和 /etc/sudoers
一样, 优点包括:
- 不需要编辑 {ic|sudoers.pacnew}} 文件;
- 如果新配置有问题,可以删除这个文件而不用编辑
/etc/sudoers
.
疑难解答
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
显示用户权限
通过下列命令查看用户权限:
sudo -lU 用户名
仅查看自己的权限:
sudo -l
输出:
Matching Defaults entries for yourusename on this host: loglinelen=0, logfile=/var/log/sudo.log, log_year, syslog=auth, mailto=sqpt.webmaster@gmail.com, mail_badpass, mail_no_user, mail_no_perms, env_reset, always_set_home, tty_tickets, lecture=always, pwfeedback, rootpw, set_home User yourusename may run the following commands on this host: (ALL) ALL, (ALL) NOPASSWD: /usr/sbin/lsof, /bin/nice, /usr/sbin/ss, /usr/bin/su, /usr/bin/locate, /usr/bin/find, /usr/bin/rsync, /usr/bin/strace, (ALL) /bin/nice, /bin/kill, /usr/bin/nice, /usr/bin/ionice, /usr/bin/top, /usr/bin/kill, /usr/bin/killall, /usr/bin/ps, /usr/bin/pkill, (ALL) /usr/sbin/gparted, /usr/bin/pacman (ALL) /usr/local/bin/synergyc, /usr/local/bin/synergys, (ALL) /usr/bin/vim, /usr/bin/nano, /usr/bin/cat (root) NOPASSWD: /usr/local/bin/synergyc
权限 Umask
Sudo 会统一用户的 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 文件
此页面 列出了所有可用配置。