当我在终端中输入 sudo 命令时,它显示以下错误:
sudo: /etc/sudoers is owned by uid 1000, should be 0
sudo: no valid sudoers sources found, quitting
sudo: unable to initialize policy plugin
我该如何解决?
答案1
将所有者更改回 root:
pkexec chown root:root /etc/sudoers /etc/sudoers.d -R
或者使用以下visudo
命令来确保文件的总体正确性:
pkexec visudo
答案2
另一种选择,适用于没有密码的情况root
。ubuntu
我曾因疏忽而丢失了所有权(次数多得我都不想承认),最后做了以下事情:
sudo chown -R owner:group /
而不是这样:
sudo chown -R owner:group .
这几乎总是在 Vagrant 管理的 VirtualBox VM 环境中运行 Ubuntu headless,所以 YMMV。到目前为止,我还没有找到好的解决办法,但这似乎很容易解决问题。
维修
- 创建或编辑 /etc/rc.local
- 笔记 以 vagrant 用户身份执行此操作,无需尝试将权限设置为 root。
- 对于这个任务,/etc/rc.local 应该如下所示:
#!/bin/sh -e
#
# rc.local
#
# This script is executed at the end of each multiuser runlevel.
# Make sure that the script will "exit 0" on success or any other
# value on error.
#
# In order to enable or disable this script just change the execution
# bits.
#
# By default this script does nothing.
chown -R root:root /etc/sudoers.d
chown root:root /etc/sudoers
chmod 440 /etc/sudoers
exit 0
- 断开与 SSH 的连接
- 打开 VirtualBox 管理器
- 右键单击有问题的虚拟机
- 选择‘关闭’=>‘ACPI 关闭’
- 通过右键单击 VM 条目然后选择“开始”=>“正常启动”从 VirtualBox 管理器启动 VM
- 通过 SSH 进入虚拟机
- 使用您现在恢复的 sudo 设置 / 子级的权限回到 root:root
修复完成后,可以删除 /etc/rc.local 中的命令。
答案3
恢复
sudo chown myuser:myuser /etc/sudoers
chmod u+w /etc/sudoers
chmod u-w /etc/sudoers
sudo chown root:root /etc/sudoers
最后一个导致“sudo:/etc/sudoers 由 uid 1000 拥有,应该是 0”等错误。我尝试使用 su - sudo ,我看到了建议,但我认为 root 密码从未设置过,所以这不起作用。¹
为了修复此问题,我重新启动了电脑,进入了 root shell 并且²
chown root:root /etc/sudoers
passwd root #for good measure, e.g., so su - root would work in the future!
重新启动,瞧!
注意:当我最初尝试修复该问题时,建议的 pkexec 命令对我不起作用。通过恢复模式 root shell 修复后,我随后尝试了它,弹出一个 GUI 窗口要求我输入密码,它确实有效,所以 YMMV。
¹ 修复问题后,我重复了上述步骤,并成功恢复²
su - root
chown root:root /etc/sudoers
² Rohlt 建议的命令列表对我来说是不必要的,但它们可能适用于其他情况。
答案4
就我而言,我正在运行适用于 Linux 的 Windows 子系统 (WSL2)。我使用 VSCode(在 Windows 中运行)创建了一个文件夹,并打开它以在其中创建更多文件。
关闭 VSCode(一直在后台运行)后,我尝试从 WSL2 终端删除创建的文件夹并出现上述错误。
解决方案是完全终止 VSCode 实例(或重新启动系统),因为它保持文件夹打开。