我的问题是几乎完全一样的以下链接 ,除了我的SSH服务器在docker集装箱。
我的Dockerfile非常简单。
FROM ubuntu:12.04 ENV DEBIAN_FRONTEND noninteractive RUN apt-get update RUN apt-get install -y openssh-server less nano RUN mkdir /var/run/sshd RUN adduser chrome RUN echo "chrome:chrome" | chpasswd RUN echo "root:chrome" | chpasswd EXPOSE 22 CMD ["/usr/sbin/sshd", "-D"]
当我尝试SSHlogin,它永远挂起启动壳。
$ ssh -p2222 chrome@localhost /bin/bash --noprofile --norc # trying to login with ssh chrome@localhost's password: <-------------hangs forever
如果我在ssh上使用-t参数,我可以login。 我不知道为什么。
运行像ls这样的程序没有问题。 也许有人可以复制这个容器,并找出问题所在?
这与docker无关,当你ssh到远程主机时,你可以得到同样的结果。
这个问题的一个线索是在ssh手册页
-t强制伪tty分配。 这可以用来在远程机器上执行任意屏幕程序,这在实现菜单服务时非常有用。 多个-t选项强制tty分配,即使ssh没有本地tty。
所以,如果你提供一个远程命令来运行,ssh不会使用tty分配,除非你使用-t开关。 由于bash是交互式的,它需要一个tty。
以下将不会挂起
$ ssh -p2222 chrome@localhost /bin/bash -i --noprofile --norc
bash的-i选项是获得交互式 shell所必需的。
从Bash参考手册1.2什么是shell? 部分:
壳可以以交互方式或非交互方式使用。 在交互模式下,他们接受从键盘input的input。 当以非交互方式执行时,shell会执行从文件读取的命令。
和6.3.1什么是交互式Shell? :
交互式shell是一个启动时没有非选项参数,除非指定了-s,没有指定-c选项,并且其input和错误输出都连接到terminal(由isatty(3)确定),或者以-i选项。
交互式shell通常从用户的terminal读取和写入。
当您使用docker run启动容器时,您必须指定-it作为交互式terminal,其原因与上面所述完全相同。
作为您的dockerfile一个观察,您可以将--net=host添加到您的--net=host docker run命令中,以便在不希望显式使用EXPOSE 22 ,容器可以访问本机NICconfiguration。
此外,(听起来很愚蠢,我知道)我已经有问题在dockerlogin,即使在一个本地容器, 似乎挂起,但如果我只是按<enter>我然后得到提示…