'苏' Docker中的命令返回'必须从终端'

时间:2016-04-29 17:52:07

标签: linux docker

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

我设置了'用户'用户使用密码,但当我尝试用su切换到它时,我得到" su必须从终端"。

运行。

如果我尝试ssh到docker并且通过php shell发出命令(在Docker实例上运行apache服务),我会得到这个。

非常感谢任何帮助。

3 个答案:

答案 0 :(得分:35)

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

答案1:使用ssh登录时使用ssh -t或ssh -tt来获取pty:

在运行如下所示的会话时,由于ptys而得到正确运行的命令非常有趣:jenkins shell - > ssh驱动程序 - > ssh test - >码头工人 这里的答案很好: https://unix.stackexchange.com/questions/105422/command-must-be-run-from-a-terminal

"尝试ssh的-t选项。如果这不起作用,请尝试-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:~# 

答案 1 :(得分:6)

此解决方案使用'脚本'来自' bsdutiles'设置pty(终端)的包。睡眠'命令是为了防止在' su'之前发送密码。命令已准备好读取它。 '尾巴'命令删除"密码:"输入行由' su'。

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

请注意rootpassword可以通过多种方式查看(history,ps,/ proc /等等)。使用空格启动命令以至少避免历史记录。

答案 2 :(得分:0)

如果您使用su-exec代替su,则tty问题会完全消失,因为它会直接调用execvp,而不是像su那样分叉。

Gosu是另一种类似的选择。