我正在开发一个用于教学目的的docker环境,并且需要能够在docker中切换用户.
我用密码设置'user'用户但是当我尝试用su切换到它时,我得到"su必须从终端运行".
如果我尝试ssh到docker并通过php shell发出命令(在Docker实例上运行apache服务),我会得到这个.
任何帮助深表感谢.
gao*_*the 36
当你通过php进入或进入时,你的会话没有被分配一个pty.我使用了以下每种解决方案:
回答1:使用ssh登录时使用ssh -t或ssh -tt来获取pty:
在运行这样的会话时,由于ptys得到正确的命令,我很有乐趣:jenkins shell - > ssh driver - > ssh test - > docker exec.这里的答案很好:https: //unix.stackexchange.com/questions/105422/command-must-be-run-from-a-terminal
"尝试ssh的-t选项.如果这不起作用,请尝试-tt."
"-t强制伪tty分配.这可用于在远程机器上执行任意基于屏幕的程序,这可能非常有用,例如在实现菜单服务时.多个-t选项强制tty分配,即使ssh没有当地的."
答案2:使用docker run -t ...和docker exec -it
使用-t和-it选项在docker exec会话中分配pty.
使用docker exec,您只需使用-u选项以不同的用户身份登录容器,并避免使用su.例如
$ docker exec -u root -it small_hypatia bash
Run Code Online (Sandbox Code Playgroud)
这里有一个很好的问题和答案: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:~#
Run Code Online (Sandbox Code Playgroud)
小智 6
此解决方案使用'bsdutiles'包中的'script'命令来设置pty(终端).'sleep'命令用于防止在'su'命令准备好读取之前发送密码.'tail'命令删除'su'发出的"Password:"输入行.
sh -c "sleep 1; echo rootpassword" | script -qc 'su -c whoami - root' | tail -n +2
Run Code Online (Sandbox Code Playgroud)
请注意,rootpassword可以通过多种方式查看(history,ps,/ proc /等等).使用空格启动命令以至少避免历史记录.
归档时间: |
|
查看次数: |
35750 次 |
最近记录: |