解决macOS上sudoers权限问题

前言

前面一篇文章说到,如果要更改 /etc/sudoers 里的内容,比如设置用户 sudo 操作免密码验证等,最好先切换到 root 用户,再进行编辑,最后强制保存。如果不这么做,而使用 chmod 来更改权限,就会导致之后的 sudo 操作全部被拒绝。

问题与解决

问题是这样的,我需要编辑 /etc/sudoers 文件,想让当前用户使用 sudo 操作可以免密码验证,但是保存不了,一直提示文件是只读的,:wq! 强制保存也不行,提示文件不属于当前用户所拥有。

于是敲了一句 chmod:

1
$ sudo chmod a+w /etc/sudoers

修改了 /etc/sudoers 的权限,再用 sudo 命令的时候,必定会出现报错:

1
2
sudo: /etc/sudoers is owned by uid 501, should be 0
sudo: no valid sudoers sources found, quitting

501 是我当前登录的用户 bingo,而 0 应该是 root 用户。

网上的解决方案是进入 recovery mode,将 sudoers 的权限修改回来。但我不相信必须要这么做,想先尝试看能不能改得回来。

于是将 /etc/sudoers 的 owner 和组,修改为 admin:

1
$ chown root:admin /etc/sudoers

执行这一句命令时出现一个报错:

1
$ chown: /etc/sudoers: Operation not permitted

那这就很尴尬了,sudo 本来就已经不能用了,怎么办?

幸好,在 macOS 上还可以开启 root 用户:
系统偏好设置 -> 用户与群组 -> 登录选项 -> 网络账户服务器 -> 加入 -> 打开目录实用工具 -> 解锁 -> 顶部菜单栏 -> 编辑 -> 启用 Root 用户。

然后终端 su root 切换到 root 用户,此时拥有最高权限,任何操作都要慎重。

再次执行原来那句命令:

1
$ chown root:admin /etc/sudoers

就不会有 Operation not permitted 的报错了,然后 exit 退出 root 用户后,随便执行一句 sudo 操作命令,又出现另外一个报错:

1
2
3
sudo: /etc/sudoers is world writable
sudo: no valid sudoers sources found, quitting
sudo: unable to initialize policy plugin

这个好解决,应该还是 /etc/sudoers 的权限问题,继续 su 切换到 root 用户,然后改权限:

1
2
3
$ su
$ chmod 555 /etc/sudoers
$ exit

然后再随便敲一句 sudo,没有报错,问题已解决。

后话

这是一个教训,/etc/sudoers 这个文件千万不要随便乱动。为了保护系统安全,sudoers 的权限一旦修改后,任何 sudo 命令都会被拒绝。

如果真的要编辑,就切换到 root 用户再进行操作,千万不要随便更改权限。否则,代价可能是非常巨大的。

  • 本文作者: Bingo
  • 本文链接: https://blog.bingo.ren/59.html
  • 版权声明: 本博客所有文章除特别声明外,均采用 MIT 许可协议。转载请注明出处!