
在 Linux 中配置 sudo
的权限,我一直都以为只要在 /etc/sudoers
文件里把相应的规则写上就行了。我的用户 user
已经是 sudo
组的成员了,但每次执行 sudo
命令时都得输入密码,感觉特别麻烦。于是,我决定把它改成无密码模式。
我打开了 visudo
,并在文件里添加了这一行:
user ALL=(ALL) NOPASSWD: ALL
但是,当我尝试执行 sudo
命令时,它依然固执地要求我输入密码。我反复检查了配置,确认语法没错,也确定我的用户名写对了。
这时,我开始怀疑是不是其他配置在作祟。我注意到文件里有一行默认的配置,它管理着整个 sudo
组的权限:
%sudo ALL=(ALL:ALL) ALL
这条规则的意思是,sudo
组里的所有用户在任何地方、以任何用户的身份执行任何命令,都必须输入密码。
我尝试把我的无密码规则改写成这样:
%user ALL=(ALL) NOPASSWD: ALL
但结果还是一样,没有任何变化。
经过一番研究,我才恍然大悟:sudoers
文件中的规则是有顺序的,并且是会相互覆盖的! sudo
会从上到下逐行读取配置,一旦找到第一条匹配的规则,它就会立即应用这条规则,并忽略后面所有相关的配置。
我的问题就出在这里:
# 这是默认的配置,在文件比较靠前的位置
%sudo ALL=(ALL:ALL) ALL
# 这是我添加的规则,在文件比较靠后的位置
user ALL=(ALL) NOPASSWD: ALL
因为我的用户 user
属于 sudo
组,所以 sudo
在读取到 %sudo
那一行时,就直接匹配上了。这条规则要求输入密码,所以后面的 user ALL=(ALL) NOPASSWD: ALL
规则就直接被忽略了。
找到问题后,解决方法就很简单了。我将我自己的无密码规则放到了 %sudo
规则的前面,这样它就会优先被匹配和应用。
# 将这条规则放在前面
user ALL=(ALL) NOPASSWD: ALL
# 保持默认规则不变
%sudo ALL=(ALL:ALL) ALL
保存文件后,我再次执行 sudo
命令,果然不再需要输入密码了!
期间我还求助了 AI 工具,Gemini,结果回我说顺序不影响,我真的是信了邪。目前还是要警惕 AI 幻觉的。