如何让SSH连接Debian Docker容器获得完整交互式Shell?
解决Debian容器SSH交互式Shell问题
问题根源
你的Dockerfile和配置存在几个关键问题,导致无法获取完整交互式Shell:
- 镜像构建阶段执行
service ssh start完全无效,容器启动时sshd是通过CMD重新启动的,这个RUN步骤不会保留任何运行状态 - 默认sshd配置可能限制了TTY,且创建用户时未指定完整交互式Shell
- 容器启动参数未正确分配终端资源
修正后的Dockerfile
FROM debian:latest # 安装依赖并清理缓存减小镜像体积 RUN apt-get update && apt-get install -y --no-install-recommends openssh-server sudo nano \ && rm -rf /var/lib/apt/lists/* # 创建sshd运行目录 RUN mkdir -p /var/run/sshd # 修改sshd配置,确保允许TTY和交互式会话 RUN echo "PermitTTY yes" >> /etc/ssh/sshd_config \ && echo "X11Forwarding yes" >> /etc/ssh/sshd_config \ && echo "AllowTcpForwarding yes" >> /etc/ssh/sshd_config # 创建用户并指定默认Shell为bash(关键:默认useradd可能用sh,而非交互式bash) RUN useradd -m -s /bin/bash john && echo "john:john" | chpasswd && adduser john sudo EXPOSE 22 # 启动sshd,强制前台运行并输出日志便于排查 CMD ["/usr/sbin/sshd", "-D", "-e"]
容器启动命令
启动容器时必须加上-t参数分配伪终端,配合-d后台运行:
docker run -d -p 2222:22 --name ssh-container -t your-image-name
SSH连接命令
连接时使用-tt强制分配TTY(即使本地无终端也能生效):
ssh -tt john@localhost -p 2222
验证步骤
如果问题仍存在,进入容器检查用户Shell配置:
docker exec -it ssh-container cat /etc/passwd | grep john
确保输出中用户的Shell为/bin/bash,而非/bin/sh
内容的提问来源于stack exchange,提问作者dev_uno
相关产品推荐
相关产品推荐

