解决macOS上sudoers权限问题
# 前言
前面一篇文章说到,如果要更改 /etc/sudoers 里的内容,比如设置用户 sudo 操作免密码验证等,最好先切换到 root 用户,再进行编辑,最后强制保存。如果不这么做,而使用 chmod 来更改权限,就会导致之后的 sudo 操作全部被拒绝。
# 问题与解决
问题是这样的,我需要编辑 /etc/sudoers 文件,想让当前用户使用 sudo 操作可以免密码验证,但是保存不了,一直提示文件是只读的,:wq!
强制保存也不行,提示文件不属于当前用户所拥有。
于是敲了一句 chmod:
$ sudo chmod a+w /etc/sudoers
修改了 /etc/sudoers 的权限,再用 sudo 命令的时候,必定会出现报错:
sudo: /etc/sudoers is owned by uid 501, should be 0
sudo: no valid sudoers sources found, quitting
2
501 是我当前登录的用户 bingo,而 0 应该是 root 用户。
网上的解决方案是进入 recovery mode,将 sudoers 的权限修改回来。但我不相信必须要这么做,想先尝试看能不能改得回来。
于是将 /etc/sudoers 的 owner 和组,修改为 admin:
$ chown root:admin /etc/sudoers
执行这一句命令时出现一个报错:
$ chown: /etc/sudoers: Operation not permitted
那这就很尴尬了,sudo 本来就已经不能用了,怎么办?
幸好,在 macOS 上还可以开启 root 用户: 系统偏好设置 -> 用户与群组 -> 登录选项 -> 网络账户服务器 -> 加入 -> 打开目录实用工具 -> 解锁 -> 顶部菜单栏 -> 编辑 -> 启用 Root 用户。
然后终端 su root 切换到 root 用户,此时拥有最高权限,任何操作都要慎重。
再次执行原来那句命令:
$ chown root:admin /etc/sudoers
就不会有 Operation not permitted 的报错了,然后 exit 退出 root 用户后,随便执行一句 sudo 操作命令,又出现另外一个报错:
sudo: /etc/sudoers is world writable
sudo: no valid sudoers sources found, quitting
sudo: unable to initialize policy plugin
2
3
这个好解决,应该还是 /etc/sudoers 的权限问题,继续 su 切换到 root 用户,然后改权限:
$ su
$ chmod 555 /etc/sudoers
$ exit
2
3
然后再随便敲一句 sudo,没有报错,问题已解决。
# 后话
这是一个教训,/etc/sudoers 这个文件千万不要随便乱动。为了保护系统安全,sudoers 的权限一旦修改后,任何 sudo 命令都会被拒绝。
如果真的要编辑,就切换到 root 用户再进行操作,千万不要随便更改权限。否则,代价可能是非常巨大的。