Docker中的'su'命令返回'必须从terminal运行'

我正在开发一个用于教学目的的docker环境,并且需要能够在docker中切换用户。

我用密码设置了“用户”用户,但是当我尝试用su切换到“user”时,我得到“su必须从terminal运行”。

我得到这个,如果我试图SSH入docker,也通过发出命令通过PHP shell(一个Apache服务正在运行的Docker实例)。

任何帮助深表感谢。

当你在ssh中或通过php进入时,你的会话没有被分配一个pty。 我已经使用了以下每个解决方案:

回答1:使用ssh -t或ssh -tt在使用ssh登录时分配pty:

运行这样的会话时,我得到了很好的命令来运行正确的命令:jenkins shell – > ssh driver – > ssh test – > docker exec。 这里的答案很好: https : //unix.stackexchange.com/questions/105422/command-must-be-run-from-a-terminal

“尝试-t选项ssh。如果这不起作用,请尝试-tt。

“-t强制伪tty分配,这可以用来在远程机器上执行任意的基于屏幕的程序,这可能是非常有用的,例如,当实现菜单服务时,多个-t选项强制tty分配,即使ssh没有本地tty“。

回答2:使用docker run -t …和docker exec -it

使用-t和-it选项在docker exec会话中分配pty。

另外,使用docker exec,您可以简单地使用-u选项以不同的用户身份登录到容器,并避免使用su。 例如

$ docker exec -u root -it small_hypatia bash 

这里有一个很好的问题和答案: https : //github.com/docker/docker/issues/8631

回答3:使用python在shell中产生一个pty

很可爱的黑客:)

 jenkins@e9fbe94d4c89:~$ su - su: must be run from a terminal $ echo "import pty; pty.spawn('/bin/bash')" > /tmp/asdf.py $ python /tmp/asdf.py $ su - Password: root@e9fbe94d4c89:~# 

这个解决方案通过使用设置pty(终端)的'bsdutiles'包中的'script'命令来工作。 “睡眠”命令可以防止在“su”命令准备好读取密码之前发送密码。 'tail'命令删除'su'发出的“Password:”输入行。

  sh -c "sleep 1; echo rootpassword" | script -qc 'su -c whoami - root' | tail -n +2 

请注意,rootpassword可以在许多方面看到(历史,ps,/ proc /等等…)。 用一个空格开始命令,至少避免历史记录。

如果你使用su-exec而不是su ,tty的问题就完全消失了,因为它直接调用execvp而不是像su那样分叉。

Gosu是另一个类似的选择。