Ubuntu 20.04下SSH连接Docker容器时密码正确仍遭权限拒绝
问题描述
在Ubuntu 20.04系统中,为单元测试创建可SSH连接的Docker容器,使用以下Dockerfile构建镜像:
# Use a base image with the desired OS (e.g., Ubuntu, Debian, etc.) FROM ubuntu:latest # Install SSH server RUN apt-get update && \ apt-get upgrade -y RUN apt-get install openssh-server -y supervisor RUN apt-get install nano # Create an SSH user RUN useradd -rm -d /home/sshuser -s /bin/bash -g root -G sudo -u 1000 sshuser # Set the SSH user's password (replace "password" with your desired password) RUN echo 'sshuser:password' # Allow SSH access RUN mkdir /var/run/sshd RUN /usr/bin/ssh-keygen -A # Expose the SSH port EXPOSE 22 # Start SSH server on container startup CMD ["/usr/sbin/sshd", "-D"]
执行命令docker build -t ssh_server .和docker run -d -p 22:22 ssh_server启动容器后,运行ssh sshuser@localhost并输入正确密码,却反复收到“Permission denied, please try again.”错误。该配置在Windows系统可正常运行,完整操作日志如下:
(base) joe@Ubuntu:~/git-repos/datashuttle/tests/ssh_test_images$ docker build -t ssh_server . [+] Building 1.4s (12/12) FINISHED docker:default => [internal] load build definition from Dockerfile 0.0s => => transferring dockerfile: 651B 0.0s => [internal] load metadata for docker.io/library/ubuntu:latest 1.2s => [internal] load .dockerignore 0.0s => => transferring context: 2B 0.0s => [1/8] FROM docker.io/library/ubuntu:latest@sha256:1b8d8ff4777f36f19bf 0.0s => CACHED [2/8] RUN apt-get update && apt-get upgrade -y 0.0s => CACHED [3/8] RUN apt-get install openssh-server -y supervisor 0.0s => CACHED [4/8] RUN apt-get install nano 0.0s => CACHED [5/8] RUN useradd -rm -d /home/sshuser -s /bin/bash -g root -G 0.0s => CACHED [6/8] RUN echo 'sshuser:password' 0.0s => CACHED [7/8] RUN mkdir /var/run/sshd 0.0s => CACHED [8/8] RUN /usr/bin/ssh-keygen -A 0.0s => exporting to image 0.0s => => exporting layers 0.0s => => writing image sha256:cc8b8b9f8a500fb399ae7ef2ea7ef0a667706dde81330 0.0s => => naming to docker.io/library/ssh_server 0.0s (base) joe@Ubuntu:~/git-repos/datashuttle/tests/ssh_test_images$ docker run -d -p 22:22 ssh_server cf70b859e7c1889d32f0e866697c6d273fb6bde27bb5d9f80de0ae546f5cc6dd (base) joe@Ubuntu:~/git-repos/datashuttle/tests/ssh_test_images$ ssh sshuser@localhost sshuser@localhost's password: Permission denied, please try again.
问题排查与解决
核心原因
- 密码未实际生效:原Dockerfile中仅用
echo 'sshuser:password'输出字符串,没有通过管道传给chpasswd命令,导致用户密码未被设置。 - SSH密码登录被禁用:Ubuntu最新镜像的SSH配置默认可能关闭了密码认证,需要手动开启。
修复后的Dockerfile
# 使用Ubuntu基础镜像 FROM ubuntu:latest # 更新系统并安装依赖,同时清理缓存减小镜像体积 RUN apt-get update && \ apt-get upgrade -y && \ apt-get install -y openssh-server supervisor nano && \ rm -rf /var/lib/apt/lists/* # 创建SSH用户并加入sudo组 RUN useradd -rm -d /home/sshuser -s /bin/bash -g root -G sudo -u 1000 sshuser # 正确设置用户密码:将echo输出传给chpasswd完成密码写入 RUN echo 'sshuser:password' | chpasswd # 修改SSH配置,允许密码登录 RUN sed -i 's/#PasswordAuthentication yes/PasswordAuthentication yes/' /etc/ssh/sshd_config && \ sed -i 's/PasswordAuthentication no/PasswordAuthentication yes/' /etc/ssh/sshd_config # 创建sshd运行所需目录 RUN mkdir /var/run/sshd # 生成SSH主机密钥 RUN /usr/bin/ssh-keygen -A # 暴露SSH端口 EXPOSE 22 # 启动SSH服务 CMD ["/usr/sbin/sshd", "-D"]
额外注意事项
- 端口冲突处理:如果宿主机Ubuntu本身运行了SSH服务(默认占用22端口),启动容器时会映射失败。可改为
docker run -d -p 2222:22 ssh_server,然后通过ssh sshuser@localhost -p 2222连接。 - 清理构建缓存:之前的错误镜像已被缓存,需执行
docker build --no-cache -t ssh_server .重新构建,确保修改生效。
内容的提问来源于stack exchange,提问作者Joseph
相关产品推荐
相关产品推荐

