我收到以下错误sudo
:
$ sudo ls
sudo: /etc/sudoers is owned by uid 1000, should be 0
sudo: no valid sudoers sources found, quitting
sudo: unable to initialize policy plugin
当然chown
,root
如果不使用sudo
. root
我们的帐户也没有密码。
老实说,我不知道系统是如何陷入这种混乱的,但现在由我来解决它。
通常我会启动到恢复模式,但系统是远程的,只能在正常启动时通过 VPN 访问。出于同样的原因,从 Live CD 或 USB 记忆棒引导也是不切实际的。
系统是Ubuntu 16.04(EOL以后,别问了),不过问答可能比较笼统。
这里描述的过程(它本身可能是这个 Ask Ubuntu 答案的不完美副本)创造了奇迹。我在这里复制它,并添加更多解释。
程序
打开到目标服务器的两个 SSH 会话。
在第一个会话中,通过运行以下命令获取 bash 的 PID:
在第二个会话中,使用以下命令启动身份验证代理:
使用从步骤 1 获得的 pid。
回到第一个会话,运行:
在第二个会话密码提示中输入密码。
解释
与 类似
sudo
,pkexec
允许授权用户以其他用户身份执行程序,通常是root
。它使用 polkit 进行身份验证;特别org.freedesktop.policykit.exec
是使用了动作。此操作定义在
/usr/share/polkit-1/actions/org.freedesktop.policykit.policy
:auth_admin
表示允许管理用户执行此操作。谁有资格成为管理用户?在此特定系统(Ubuntu 16.04)上,配置为
/etc/polkit-1/localauthority.conf.d/51-ubuntu-admin.conf
:因此组中的任何用户
sudo
或admin
都可以使用pkexec
.在较新的系统(Arch Linux)上,它位于
/usr/share/polkit-1/rules.d/50-default.rules
:所以在这里,
wheel
组中的每个人都是管理用户。在
pkexec
手册页中,它指出如果没有为当前会话找到身份验证代理,则pkexec
使用其自己的文本身份验证代理,这似乎是pkttyagent
. 实际上,如果您在pkexec
没有先启动pkttyagent
进程的情况下运行,则会在同一个 shell 中提示您输入密码,但在输入密码后会失败:这似乎是polkit中的一个老错误,似乎没有任何吸引力。更多讨论。
使用两个 shell 的技巧只是解决此问题的一种方法。
启动到实时环境并从那里修复它。
这显然需要“物理等效”访问的物理访问(如果处理 VM 或 VPS),但它几乎总是有效,不关心你有什么 init 系统,也不关心你是否有根密码。
一般的做法比较简单:
这种修复之所以有效,是因为它完全避开了受影响系统的访问控制,让您几乎可以随心所欲。这种对系统的无限制访问级别是物理安全如此重要的部分原因。
请注意,如果采用这种方法,您可能需要在重新启动回到“正常”系统时做一些特殊的事情以使事情正常工作。在普通的 Ubuntu 安装上,这应该是不需要的,但如果你使用 SELinux(或者更不可能使用 IMA 和 EVM),你可能需要添加额外的引导选项,然后从引导系统运行命令来修复安全标签.
对于那些确实有 root 密码的人,只需使用单用户模式。
Systemd 将此称为“救援模式”,但其他人只称其为单用户模式。这基本上引导到一个根 shell,除了运行关键服务之外几乎什么都没有。它传统上用于解决此类问题。
这样做的一个缺点是,在任何适当保护的现代系统上,单用户模式受密码保护,并且需要能够以 root 用户身份登录(原因是对系统控制台的访问本质上并不意味着物理访问到系统硬件,因此应该使用一些身份验证)。
每当您计划尝试
sudo
配置时,最好保持另一个根终端打开:如果您破坏了某些东西,您将拥有修复它的权利。如果无法保持终端打开(例如您的实验涉及重新启动),请为
root
用户设置一个实际密码。然后如果sudo
坏了,您可以简单地登录root
(打开新控制台或运行su
)并修复您的系统。