我正在开发一个用于教学目的的docker环境,需要能够在docker内部切换用户。
我用密码设置了' user‘用户,但是当我尝试使用su切换到它时,我得到了"su必须从终端运行“。
如果我尝试通过ssh进入docker,也可以通过php shell发出命令(一个apache服务在Docker实例上运行),就会得到这个结果。
任何帮助都是非常感谢的。
发布于 2017-01-26 19:17:01
当您使用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
“尝试对ssh使用-t选项。如果不起作用,请尝试使用-tt。”
“ssh强制伪tty分配。这可用于在远程计算机上执行任意基于屏幕的程序,这可能非常有用,例如,在实现菜单服务时。多个-t选项强制tty分配,即使ssh没有本地tty。”
答案2:使用docker运行-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
python答案3:使用在您的外壳中生成一个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:~# 发布于 2016-08-03 18:42:14
此解决方案通过使用'bsdutiles‘包中的'script’命令来设置pty (终端)。“sleep”命令是为了防止在“su”命令准备读取密码之前发送密码。'tail‘命令删除'su’发出的"Password:“输入行。
sh -c "sleep 1; echo rootpassword" | script -qc 'su -c whoami - root' | tail -n +2注意,rootpassword可以通过多种方式(历史、ps、/proc/等)查看。命令以空格开头,至少要避免记录历史记录。
https://stackoverflow.com/questions/36944634
复制相似问题