在 Ubuntu 20.04 上设置 docker 时,我做了sudo usermod -G docker $USER
。正如此处相关问题所述,我错过了该-a
标志并替换了所有次要组。然而,直到我重新启动机器后我才意识到这一点。这是一个单用户工作站。我可以用 修复此问题root
,但我没有密码。如何在没有 root 访问权限的情况下恢复正确的组?现在唯一引起问题的是sudo
,但我确信其他问题也会出现。我可以在不从头开始重新安装 Ubuntu 的情况下做任何事情吗?
答案1
您还剩下一组:docker
。这意味着您仍然可以控制 docker 守护进程。该守护进程可以使用主机的根文件系统运行容器已安装然后容器可以编辑文件(vi
可在忙碌盒)或更简单:可以chroot
连接到主机的文件系统。
下载最小busybox
图像:
myuser@myhost:~$ docker pull busybox
Using default tag: latest
latest: Pulling from library/busybox
b71f96345d44: Pull complete
Digest: sha256:930490f97e5b921535c153e0e7110d251134cc4b72bbb8133c6a5065cc68580d
Status: Downloaded newer image for busybox:latest
docker.io/library/busybox:latest
以交互方式并在特权模式下运行包含此映像的容器(以防 AppArmor 稍后在没有它的情况下阻止该chroot
命令):
$ docker run -it --mount type=bind,source=/,target=/host --privileged busybox
继续使用容器中的交互式命令。您可以简单地 chroot 到挂载点以“进入”根文件系统并获取所有 Ubuntu 命令:
/ # chroot /host
使用adduser
更简单的包装器useradd
:
root@74fc1b7903e5:/# adduser myuser sudo
Adding user `myuser' to group `sudo' ...
Adding user myuser to group sudo
Done.
root@74fc1b7903e5:/# exit
exit
/ # exit
注销并重新登录,或手动更改组:
myuser@myhost$ sg sudo
root 访问权限已恢复:
myuser@myhost$ sudo -i
[sudo] password for myuser:
root@myhost#
结论:是非常允许远程访问 Docker(通过端口 2375/TCP)时要谨慎。默认情况下,这意味着 root 访问权限。
答案2
我可以在不从头开始重新安装 Ubuntu 的情况下做任何事情吗?
除了其他答案中给出的特定于 docker 的方法之外,如果您具有物理访问权限并且没有适当的对策*,那么如果您准备重新启动系统,您几乎总是可以进入系统。
有几种常见的方法。
一种是使用 livecd 并挂载文件系统。
另一种方法是使用“init=/bin/sh”技巧,当您进入 grub 菜单时,选择启动选项,但不要按 Enter 键,而是按“e”,然后将“init=/bin/sh”添加到内核中命令行。这应该会让您在启动过程的早期进入 shell。此时根文件系统可能仍然是只读的,因此请mount -o remount,rw /
使其可写。然后,您应该能够使用 设置 root 密码passwd root
或将用户添加到 sudo 组adduser myuser sudo
。完成编辑后,您可以exec init
照常继续启动过程。
* BIOS/引导加载程序密码是其中之一,某些类型的磁盘加密可能是另一种。