sudo的权限控制可以在/etc/sudoers文件中查看到. 如果想要控制某个用户(或某个组用户)只能执行root权限中的一部分命令, 或者允许某些用户使用sudo时不需要输入密码,就需要对该文件有所了解。 一般来说,通过cat /etc/sudoers指令来查看该文件, 会看到如下几行代码: root ALL=(ALL:ALL) ALL %admin ALL=(ALL) ALL %sudo ALL=(ALL:ALL) ALL 对/etc/sudoers文件进行编辑的代码公式可以概括为: 授权用户/组 主机=[(切换到哪些用户或组)] [是否需要输入密码验证] 命令1,命令2,... 凡是[ ]中的内容, 都能省略; 命令和命令之间用,号分隔; 为了方便说明, 将公式的各个部分称呼为字段1 - 字段5: 授权用户/组 主机 =[(切换到哪些用户或组)] [是否需要输入密码验证] 命令1,命令2,... 字段1 字段2 =[(字段3)] [字段4] 字段5 在上面的默认例子中, "字段1"不以%号开头的表示"将要授权的用户", 比如例子中的root; 以%号开头的表示"将要授权的组", 比如例子中的%admin 和 %sudo; "字段2"表示允许登录的主机, ALL表示所有; 如果该字段不为ALL,表示授权用户只能在某些机器上登录本服务器来执行sudo命令.比如: jack mycomputer=/usr/sbin/reboot,/usr/sbin/shutdown 表示: 普通用户jack在主机mycomputer上, 可以通过sudo执行reboot和shutdown两个命令. "字段3"如果省略,表示切换到root用户; 如果为ALL, 表示能够切换到任何用户; 例子中的(ALL:ALL) 是允许任何 (用户:组) 的意思. 请注意,"字段3"如果没省略,必须使用( )双括号包含起来. sudo -u 用户名 command允许使用特定用户来执行后面command, 只是大多数时候都是以root身份来执行,所以使用sudo command即可, 省略-u选项. "字段4"的可能取值是NOPASSWD:。请注意有双引号。表示执行sudo时可以不需要输入密码。比如: lucy ALL=(ALL) NOPASSWD: /bin/useradd 表示: 普通用户lucy可以在任何主机上,通过sudo执行允许范围内的命令,并且不需要输入密码. 又比如: peter ALL=(ALL) NOPASSWD: ALL 表示: 普通用户peter可以在任何主机上,通过sudo执行任何命令,并且不需要输入密码. "字段5"是使用逗号分开一系列命令,这些命令就是授权给用户的操作; ALL表示允许所有操作. 你可能已经注意到了,命令都是使用绝对路径,这是为了避免目录下有同名命令被执行,从而造成安全隐患. 如果你将授权写成如下安全性欠妥的格式: lucy ALL=(ALL) chown,chmod,useradd 那么用户就有可能创建一个他自己的脚本, 也命名为userad, 然后放在它的本地路径中, 如此一来他就能够使用root来执行这个"名为useradd的本地脚本". 这是相当危险的! 命令的绝对路径可通过which指令查看到: 比如which useradd可以查看到命令useradd的绝对路径: /usr/sbin/useradd 公式还要扩充 例子1: papi ALL=(root) NOPASSWD: /bin/chown,/usr/sbin/useradd 表示: 用户papi能在所有可能出现的主机上, 切换到root下执行/bin/chown, 不必输入密码; 但运行/usr/sbin/useradd 命令时需要密码. 这是因为NOPASSWD:只影响了其后的第一个命令1. 上面给出的公式只是简化版,完整的公式如下。其实只需要记住简化版的公式就足够了,这里使用该例子仅仅是为了让读者在实践中不要困惑而已。 授权用户/组 主机=[(切换到哪些用户或组)] [是否需要输入密码验证] 命令1, [(字段3)] [字段4] 命令2, ... 在具有sudo操作的用户下, 执行sudo -l可以查看到该用户允许和禁止运行的命令. 通配符和取消命令 例子2: papi ALL=/usr/sbin/*,/sbin/*,!/usr/sbin/fdisk 用例子2来说明通配符*的用法, 以及命令前面加上!号表示取消该命令。 该例子的意思是: 用户papi在所有可能出现的主机上, 能够运行目录/usr/sbin和/sbin下所有的程序, 但fdisk除外. 噢,编辑/etc/sudoers没权限 “你讲了这么多,但是在实践中,我去编辑/etc/sudoers文件,系统提示我没权限啊,怎么办?” 这是因为/etc/sudoers的内容如此敏感,以至于该文件是只读的。所以,编辑该文件前,请确认清楚,你知道自己正在做什么。 可以输入visudo命令, 采用nano编辑器来编辑该文件。 也可以使用sudo vi /etc/sudoers来编辑该文件,保存时需要使用:wq!强制保存。 当然,也可以先使用chmod修改该文件的权限, 修改文件后再恢复原来权限。 不过,系统文档推荐的做法,不是直接修改/etc/sudoers文件,而是将修改写在/etc/sudoers.d/目录下的文件中。 任何在/etc/sudoers.d/目录下,不以~号结尾的文件和不包含.号的文件,都会被解析成/etc/sudoers的内容。 如果使用这种方式修改sudoers,需要在/etc/sudoers文件的最后行,加上#includedir /etc/sudoers.d语句(默认已有): #includedir /etc/sudoers.d 注意了,这里的指令#includedir是一个整体, 前面的#号不能丢,也不能在#号后有空格。 并且,尽可能使用visudo来编辑sudoers, 因为有相关的错误识别机制。