问题描述
Preface
这是一个相当复杂的与Sudoers文件和sudo命令相关的问题。
注:我在运行Ubuntu Desktop 13.04的专用计算机上进行了这些更改,我纯粹将其用于学习目的。我知道启用NOPASSWD sudo会带来巨大的安全风险。
Question
最初,我对sudoers文件(/etc /sudoers)的唯一改动是一行,一个用户规范应该使’nicholsonjf’能够使用sudo运行所有命令,而不必输入密码(请参阅以’nicholsonjf’开头的行):
# This file MUST be edited with the 'visudo' command as root.
#
# Please consider adding local content in /etc/sudoers.d/ instead of
# directly modifying this file.
#
# See the man page for details on how to write a sudoers file.
#
Defaults env_reset
Defaults mail_badpass
Defaults secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
# Host alias specification
# User alias specification
# Cmnd alias specification
# User privilege specification
root ALL=(ALL:ALL) ALL
nicholsonjf ALL=NOPASSWD: ALL
# Members of the admin group may gain root privileges
%admin ALL=(ALL) ALL
# Allow members of group sudo to execute any command
%sudo ALL=(ALL:ALL) ALL
# See sudoers(5) for more information on "#include" directives:
#includedir /etc/sudoers.d
但是,这并没有奏效,每次我运行命令’nicholsonjf’时,仍然会提示输入密码。我只能从sudo和admin组中删除’nicholsonjf’,然后才能开始以’nicholsonjf’的身份运行sudo命令。
任何人都可以解释为什么这工作?
是否因为用户’nicholsonjf’继承了’admin’和’sudo’两个组规范中的sudo权限(在sudoers文件中可以看到),它们覆盖了’nicholsonjf’用户规范,因为它们进一步在配置文件中?
最佳解决思路
您添加的行被覆盖。来自man sudoers
:
When multiple entries match for a user, they are applied in order. Where there are multiple matches, the last match is used (which is not necessarily the most specific match).
在你的情况下,nicholsonjf
是sudo
组的成员,所以对他来说这一行适用:
%sudo ALL=(ALL:ALL) ALL
如果您想要覆盖/etc/sudoers
中的条目,只需将新条目放在它们后面。
新条目应该看起来像
myuser ALL=(ALL) NOPASSWD:ALL
适用于单个用户,或者
%sudo ALL=(ALL) NOPASSWD:ALL
为一组。
次佳解决思路
对于单个用户:
superuser ALL=(ALL) NOPASSWD:ALL
对于一个组:
%supergroup ALL=(ALL) NOPASSWD:ALL