使用 Docker 自救:当 SSH 服务被误删,VNC无法登录时的恢复实战

在服务器运维过程中,难免会遇到意外,比如误卸载了 openssh-server,导致远程 SSH 服务中断,无法远程登录。这种情况看似致命,但只要你的服务器还能运行 Docker,并且你能通过远程管理工具(如 Portainer)控制 Docker 容器,就可以利用 Docker 来实现自救。

本文结合我在 Oracle Cloud ARM64 服务器上的真实经历,分享如何用 Docker 容器恢复 SSH 服务,快速重获远程登录权限。


一、问题背景

  • 误删 libwrap0 导致 openssh-server 被连带卸载
  • 服务器 SSH 服务断开,无法远程连接
  • Oracle Cloud 控制台提供的实例控制台 SSH 连接因算法兼容问题暂时不可用
  • VNC 连接,Ubuntu 登陆密码也忘了
  • 但服务器上 Docker 仍可远程管理(使用 Portainer)

二、恢复思路

利用 Docker 创建一个“临时修复容器”,挂载宿主机根目录,通过 chroot 进入宿主系统环境,重新安装并启动 SSH 服务。


三、详细步骤

1. 准备一个特权 Ubuntu 容器

使用以下 docker-compose.yml,在 Portainer 中新建 Stack 运行:

services:
  ssh-fix-helper:
    image: ubuntu:22.04
    container_name: ssh-fix-helper
    privileged: true
    command: sleep infinity
    volumes:
      - /:/mnt
    network_mode: host
    stdin_open: true
    tty: true

说明:

  • privileged: true 允许容器有宿主机高级权限
  • 挂载 / 到容器的 /mnt,方便访问宿主机文件系统
  • network_mode: host 保证容器网络与宿主机一致,解决 DNS 解析问题

2. 进入容器终端

在 Portainer 里打开 ssh-fix-helper 容器的终端。

3. 进入宿主系统环境

chroot /mnt

此时相当于进入了宿主机根目录环境。

4. 修复 SSH 服务

apt update
apt install -y libwrap0 openssh-server
mkdir -p /run/sshd
chmod 755 /run/sshd
/usr/sbin/sshd

启动时,如果出现 Failed to connect to bus 错误,说明 systemd 不可用,直接运行 sshd 二进制即可。

5. 验证 SSH 是否监听

ss -tlnp | grep :22

看到 22 端口监听即表示 SSH 服务已正常启动。


四、远程连接恢复

在本地机器执行:

ssh-keygen -R <服务器IP>
ssh root@<服务器IP>

如果出现 “REMOTE HOST IDENTIFICATION HAS CHANGED” 警告,执行 ssh-keygen -R <服务器IP> 清除旧指纹即可。


五、经验总结与注意事项

  • 使用 Docker 进行系统自救,前提是 Docker 服务正常且能远程控制
  • 通过挂载宿主根目录和 chroot,能在容器内操作宿主系统,重装关键服务
  • 运行 sshd 时需确保 /run/sshd 目录存在,权限正确
  • systemd 在 chroot 里不可用时,直接启动 sshd 二进制即可
  • 修复完成后,务必设置 SSH 开机自启:systemctl enable ssh
  • 远程 SSH 连接遇到指纹变更提示时,安全处理并删除旧指纹即可

六、结束语

这次经历让我深刻认识到 Docker 不仅仅是部署服务的利器,也是服务器运维中强有力的应急工具。掌握这种“容器自救”技巧,可以在关键时刻挽救你宝贵的远程访问权限,避免重装或复杂的线下操作。

欢迎大家收藏和分享,提升自己的运维能力!

使用 Hugo 构建
主题 StackJimmy 设计