You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让SSH连接Debian Docker容器获得完整交互式Shell?

解决Debian容器SSH交互式Shell问题

问题根源

你的Dockerfile和配置存在几个关键问题,导致无法获取完整交互式Shell:

  1. 镜像构建阶段执行service ssh start完全无效,容器启动时sshd是通过CMD重新启动的,这个RUN步骤不会保留任何运行状态
  2. 默认sshd配置可能限制了TTY,且创建用户时未指定完整交互式Shell
  3. 容器启动参数未正确分配终端资源

修正后的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 08:45:37