假设我有以下 Dockerfile:
FROM php:7.4
RUN apt-get install -y openssh-server \
&& mkdir /var/run/sshd \
&& echo 'root:root' | chpasswd \
&& sed -i 's/PermitRootLogin prohibit-password/PermitRootLogin yes/' /etc/ssh/sshd_config \
&& service ssh start
我按照这个 Dockerfile 创建了一个 Docker 实例:
docker build -t test .
docker run -t -d --privileged test bash
docker exec -it {whatever} bash
此后,我尝试通过 SSH 进入机器,但是不起作用:
root@5e3395ae4b64:/# ssh 127.0.0.1
ssh: connect to host 127.0.0.1 port 22: Connection refused
如果我service ssh start
再次这样做,它会起作用,但我不知道为什么我需要这样做,因为我已经在 Dockerfile 中这样做了。
无论如何,在我这样做之后service ssh start
,密码验证不起作用:
The authenticity of host '127.0.0.1 (127.0.0.1)' can't be established.
ECDSA key fingerprint is SHA256:hQcDdJFTmCZvhJzWbbis5OvCiqx1eagG0b6SD83GbJo.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '127.0.0.1' (ECDSA) to the list of known hosts.
[email protected]'s password:
Permission denied, please try again.
[email protected]'s password:
(我手动输入了root作为密码)
有任何想法吗?
答案1
我认为 root shell 已被禁用。你可以在
cat /etc/passwd
如果可以访问的话。尝试一下,然后告诉我是否有 root 用户的 shell。
那么你可以测试一下
netstat -an | grep 22
查看 sshd 正在监听哪些主机。如果你没有看到 127.0.0.1
尝试看看是否在/etc/ssh/sshd_config您正在使用允许用户指令优先于允许Root登录。
看看你的 DockerFile 的这一行是否应用到你的文件中:
sed -i 's/PermitRootLogin prohibit-password/PermitRootLogin yes/' /etc/ssh/sshd_config
答案2
我最终通过创建一个新用户来实现这个功能:
&& useradd --create-home --base-dir /home newuser \
&& echo "newuser:newuser" | chpasswd \