我正在为教学目的开发一个docker环境,并且需要能够在docker中切换用户。
我设置了'用户'用户使用密码,但当我尝试用su切换到它时,我得到" su必须从终端"。
运行。如果我尝试ssh到docker并且通过php shell发出命令(在Docker实例上运行apache服务),我会得到这个。
非常感谢任何帮助。
答案 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)