首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Docker中的“‘su”命令返回“必须从终端运行”

Docker中的“‘su”命令返回“必须从终端运行”
EN

Stack Overflow用户
提问于 2016-04-30 01:52:07
回答 3查看 49K关注 0票数 22

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

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

如果我尝试通过ssh进入docker,也可以通过php shell发出命令(一个apache服务在Docker实例上运行),就会得到这个结果。

任何帮助都是非常感谢的。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 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。例如:

代码语言:javascript
复制
$ docker exec -u root -it small_hypatia bash

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

python答案3:使用在您的外壳中生成一个pty

这是一个相当可爱的技巧:)

代码语言:javascript
复制
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:~# 
票数 38
EN

Stack Overflow用户

发布于 2016-08-03 18:42:14

此解决方案通过使用'bsdutiles‘包中的'script’命令来设置pty (终端)。“sleep”命令是为了防止在“su”命令准备读取密码之前发送密码。'tail‘命令删除'su’发出的"Password:“输入行。

代码语言:javascript
复制
 sh -c "sleep 1; echo rootpassword" | script -qc 'su -c whoami - root' | tail -n +2

注意,rootpassword可以通过多种方式(历史、ps、/proc/等)查看。命令以空格开头,至少要避免记录历史记录。

票数 9
EN

Stack Overflow用户

发布于 2017-10-15 04:11:13

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

Gosu是另一个类似的选择。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36944634

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档