Can';t在docker中ssh localhost

Can';t在docker中ssh localhost,docker,ssh,Docker,Ssh,我通过这样的dockerfile:docker build-t debian ssh:v00启用ssh来构建docker映像。 From debian WORKDIR / RUN apt update && apt install -y openssh-server sudo RUN sed -i "s/UsePAM yes/UsePAM no/g" /etc/ssh/sshd_config RUN echo "root:123456" |

我通过这样的dockerfile:
docker build-t debian ssh:v00启用ssh来构建docker映像。

From debian
WORKDIR /
RUN apt update && apt install -y openssh-server sudo
RUN sed -i "s/UsePAM yes/UsePAM no/g" /etc/ssh/sshd_config
RUN echo "root:123456" | chpasswd
RUN echo "root   ALL=(ALL)       ALL" >> /etc/sudoers
# RUN ssh-keygen -t rsa -f /etc/ssh/ssh_host_rsa_key
# RUN ssh-keygen -t ecdsa -f /etc/ssh/ssh_host_ecdsa_key
# RUN ssh-keygen -t dsa -f /etc/ssh/ssh_host_dsa_key
RUN mkdir /run/sshd
# RUN mkdir /var/run/sshd
EXPOSE 22
CMD ["/usr/sbin/sshd", "-D"]
构建之后,我通过
docker run-d——名称ssh00 debian-ssh00
启动容器。然后,
docker exec-it ssh00 bash
->
ssh localhost
,它会给我一个消息:

The authenticity of host 'localhost (127.0.0.1)' can't be established.
ECDSA key fingerprint is SHA256:sF5hbx2GTw/Fq3QhQyRJ2+YNwBFPy/Iu5c8PtgpU/ok.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'localhost' (ECDSA) to the list of known hosts.
root@localhost's password:
Permission denied, please try again.
root@localhost's password:
Permission denied, please try again.
root@localhost's password:
root@localhost: Permission denied (publickey,password).
我在上面键入密码
123456
。为什么会这样

我使用最新版本的docker for windows,即docker engine v20.10.2,但仍使用后端hyper-V

更新:

有一个关于2020年的官方教程。但是现在不鼓励这样做。

首先,在Docker bash会话中,尝试(再次)更改根密码:它将要求您输入旧密码(您在Docker文件中输入的密码)。
这样,您可以再次检查默认容器帐户(此处
root
)是否确实具有密码“123456”

其次,在详细模式下尝试相同的ssh命令,以查看是否有明显的线索:

ssh -vv localhost
如果root的密码正确,则检查您:如果它具有
权限登录号
,则将不允许任何root会话

如果这样做有效,您需要修改Dockerfile以修改
/etc/ssh/sshd\u config

委员会确认:

运行echo“permitrotlogin yes”>/etc/ssh/sshd\u config
将使基于debian的容器工作


这纯粹是sshd守护程序问题的配置。默认情况下,出于安全原因,禁用通过密码身份验证访问根帐户,因此您有两个选项:

  • 更改ssh守护程序的配置,并允许对根帐户进行密码身份验证(请注意,我们默认不允许根帐户访问是有原因的,因此我建议您保持这种方式)
  • 在此上下文中设置根帐户的公钥/私钥和授权密钥文件。我不确定您想如何使用这个容器,一般来说,您只需将公钥添加到/root/.ssh/authorized_keys文件中即可
  • 如果你真的想解决你的问题

    ssh localhost
    
    您可以在docker文件中添加一行,该行生成公钥/私钥对,并将其添加到根用户的授权密钥中,也可以在首次使用docker exec命令登录后运行此命令

    更改的Dockerfile(公钥/私钥版本)

    或者在bash中执行后在容器中运行该命令

     ssh-keygen -b 2048 -t rsa -f /root/.ssh/id_rsa -q -N "" && cat /root/.ssh/id_rsa.pub>/root/.ssh/authorized_keys
    
    更新: 您正在使用sed,但sed不可用,因此对于初学者,您需要使用apt添加sed,如果您想使用Permitrotlogin yes构建此容器,则需要使用sed更改/etc/ssh/sshd_配置文件。 您更改的Dockerfile(允许root密码登录)


    我希望这能完全解决您的问题。

    我尝试了两种方法,但仍然失败。我已经更新了结果。
    passwd
    只要求输入新密码。@Spaceship222“passwd只要求输入新密码”:好的,至少它让您有机会输入一个简单的密码并立即测试它。输入新密码“123456”后,密码实际上是“123456”,还是具有更复杂的字符(可能是特殊字符)“,它仍然无法
    ssh localhost
    @spaceship 222好的,我只是用一个附加参数编辑了答案供您检查。我同意:ssh到容器不是一个好的做法。但是在您最初的问题的上下文中,这个答案对于调试ssh连接问题仍然很有意义。@Vonc为什么ssh到容器不是一个好问题?”d实践?它一直被认为是一种反模式,因为它拓宽了容器的攻击面。它打开了一个更多的访问条目,这通常是不需要的(因为您有
    docker exec
    ).参见或。在反模式方面:我知道这种方法。但是如果您希望ssh从外部连接到容器,则必须将公钥附加到外部每个新主机的授权密钥中。我已更新了Dockerfile,准备使用Permitrotlogin yes值构建您的容器,因此您有两个以上的Dockerfile,一个具有公钥/私钥身份验证,另一个具有其次是密码认证。
     ssh-keygen -b 2048 -t rsa -f /root/.ssh/id_rsa -q -N "" && cat /root/.ssh/id_rsa.pub>/root/.ssh/authorized_keys
    
    FROM Debian
    WORKDIR /
    RUN apt update && apt install -y openssh-server sudo sed
    RUN sed -i "s/UsePAM yes/UsePAM no/g" /etc/ssh/sshd_config && sed -i "s/#PermitRootLogin prohibit-password/PermitRootLogin yes/g" /etc/ssh/sshd_config
    RUN echo "root:123456" | chpasswd
    RUN echo "root   ALL=(ALL)       ALL" >> /etc/sudoers
    # RUN ssh-keygen -t rsa -f /etc/ssh/ssh_host_rsa_key
    # RUN ssh-keygen -t ecdsa -f /etc/ssh/ssh_host_ecdsa_key
    # RUN ssh-keygen -t dsa -f /etc/ssh/ssh_host_dsa_key
    RUN mkdir /run/sshd
    # RUN mkdir /var/run/sshd
    EXPOSE 22
    CMD ["/usr/sbin/sshd", "-D"]