在服务器运维过程中,难免会遇到意外,比如误卸载了 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 不仅仅是部署服务的利器,也是服务器运维中强有力的应急工具。掌握这种“容器自救”技巧,可以在关键时刻挽救你宝贵的远程访问权限,避免重装或复杂的线下操作。
欢迎大家收藏和分享,提升自己的运维能力!