Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

'su' command in Docker returns 'must be run from terminal'

Tags:

I'm developing a docker environment for teaching purposes and need to be able to switch users inside docker.

I set up the 'user' user with a password but when I try to switch to it with su, I get "su must be run from terminal".

I get this if I try to ssh into the docker and also by issuing commands through a php shell (an apache service is running on the Docker instance).

Any help is much appreciated.

like image 770
ptr0x01 Avatar asked Apr 29 '16 17:04

ptr0x01


People also ask

How do I run a docker command in terminal?

To list available commands, either run docker with no parameters or execute docker help : $ docker Usage: docker [OPTIONS] COMMAND [ARG...] docker [ --help | -v | --version ] A self-sufficient runtime for containers.

What is the Run command in docker?

The docker run command first creates a writeable container layer over the specified image, and then starts it using the specified command. That is, docker run is equivalent to the API /containers/create then /containers/(id)/start .

What is Su in shell script?

The su command lets you switch the current user to any other user. If you need to run a command as a different (non-root) user, use the –l [username] option to specify the user account. Additionally, su can also be used to change to a different shell interpreter on the fly.


1 Answers

When you are ssh-ing in or going in via php your session is not being allocated a pty. I have used each of the following solutions:

ANSWER 1: use ssh -t or ssh -tt to get pty allocated when logging in using ssh:

I had great fun getting commands to run right due to ptys when running sessions like this: jenkins shell -> ssh driver -> ssh test -> docker exec. Good answer here: https://unix.stackexchange.com/questions/105422/command-must-be-run-from-a-terminal

"Try the -t option to ssh. If that does not work try -tt."

"-t Force pseudo-tty allocation. This can be used to execute arbitrary screen-based programs on a remote machine, which can be very useful, e.g. when implementing menu services. Multiple -t options force tty allocation, even if ssh has no local tty."

ANSWER 2: use docker run -t ... and docker exec -it

Use the -t and -it options to allocate pty in your docker exec session.

Also with docker exec you can simply use the -u option to login to container as different users and avoid using su. e.g.

$ docker exec -u root -it small_hypatia bash 

There is a good question and answer on this here: https://github.com/docker/docker/issues/8631

ANSWER 3: use python to spawn a pty in your shell

Quite a cute hack :)

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:~#  
like image 173
gaoithe Avatar answered Sep 19 '22 13:09

gaoithe