我犯了同样的错误,将我的账户添加到一个组中(忘了 -a
)。我把我的系统安装时锁定了root登录,并且我的账户是机器上唯一的账户。
接受的答案对我没有帮助。在进入恢复模式时,我只收到了一个无用的信息:
Cannot open access to console, the root account is locked. See sulogin(8) man page for more details
Press ENTER to continue
按下回车键后,系统正常启动:没能幸运地获得root权限来解决问题。我将保留这个答案,以防有人遇到和我一样的问题。只有当你通过Grub菜单无法进入恢复模式时,请使用以下方法。
获取root访问权限的步骤:
- 进入Grub菜单,并突出显示(但不要按下Enter键!)正常(默认,非恢复)的启动选项。
- 按下
e
。Grub将显示一个带有多行的命令行编辑器,每一行都可能看起来陌生或令人生畏。不用担心,您所做的任何更改都不会永久保存。
- 找到包含
linux ... ro ...
的行。这是内核命令行。将ro
替换为rw
,使根文件系统可读写,并添加另一个内核命令行参数init=/bin/sh
。这指示内核执行sh
而不是/sbin/init
。最后,该行应该如下所示:linux ... rw init=/bin/sh ...
。注意:即使只有裸露的grub>
提示符也可以继续。如果您遇到其他问题,我很乐意逐步解释如何操作;只需在此答案下留言。
- 更改完成后,按下F10使用编辑器中的命令来启动系统(或者如果您的Grub编译方式不同,请阅读编辑器窗口下方的说明)。您将获得根shell提示符,因为init进程以root身份运行。
- 进行您想要的更改,例如
usermod -a -Gadm,sudo YOURUSERID
。使用id -a YOURUSERID
确认您已恢复sudo成员身份。如果出现“命令未找到”错误,请使用/sbin/usermod
和/bin/id
。
此时无法正常关闭或重启系统。 reboot
、halt
或poweroff
都不起作用,从shell中退出将导致内核恐慌,因为PID 1进程不应该只是退出。因此,您必须执行以下两个命令:
sync
exec /sbin/init
sync
用于防止发生任何问题,将所有更改保存到磁盘上,而exec
则用真正的init
(可以是systemd、upstart或System V init,但始终称为/sbin/init
)替换shell。系统很可能会继续正常启动(没有恢复模式)。
- 登录并重新启动系统,例如
sudo reboot
——您应该已经恢复了sudo权限。建议重新启动,因为(虽然非常罕见)在正常启动过程中可能会向init
传递其他参数,而我们没有这样做。如果exec
失败,只需重置机器并让其正常启动。所有现代日志文件系统(如ext4、xfs和btrfs)都能快速恢复自身(在重置之前进行了同步),您将一切就绪。
一点背景
关于这个问题,在Debian的错误报告中有一个讨论,据我所知,这被决定为一个功能而不是一个错误,我认为这是一个相当大的错误。作为从业25年的老手,我完全不同意Michael Biebl在31楼消息中的观点:
考虑一下:你有一台拥有锁定root账户的笔记本电脑。默认情况下,
grub引导加载程序会为救援模式生成一个启动项。
因此,即使你将BIOS锁定以防止从光盘或
USB启动,并且对grub设置了密码保护,如果你把笔记本电脑短暂离开,
某人仍然可以轻易获取root权限。
在70楼消息中,Felipe Sateler提出了正确的、尽管不够普遍的反对意见:
对于许多(大多数?)计算机来说,物理接触意味着安全性丧失,因为你可以拆开机箱并取出硬盘。
这对于笔记本电脑尤其如此,正如迈克尔所说的:如果你将它短暂地离开一会儿,而有人想要获取你的数据,那么笔记本电脑将会消失得无影无踪。而对于
任何机器来说,不仅仅是“许多”或“大多数”,即使那些通过8个点固定在机架上的机器,一旦攻击者获得物理接触机器的机会,游戏就真的结束了。
mount -o remount,rw /
来挂载文件系统。 - Passufreboot -f
。 - Romain Vincent