web-dev-qa-db-fra.com

La commande 'su' dans les retours Docker 'doit être exécutée à partir du terminal'

Je développe un environnement de menu fixe à des fins pédagogiques et je dois pouvoir changer d'utilisateur dans le menu fixe.

J'ai configuré l'utilisateur 'utilisateur' avec un mot de passe, mais lorsque j'essaie d'y basculer avec su, le message "su doit être exécuté à partir du terminal".

Je l’obtiens si j’essaie de ssh dans le menu fixe et également en émettant des commandes via un shell php (un service Apache est en cours d’exécution sur l’instance de Docker).

Toute aide est très appréciée.

17
ptr0x01

Lorsque vous entrez ou entrez via php, votre session ne se voit pas attribuer un pty. J'ai utilisé chacune des solutions suivantes:

REPONSE 1: utilisez ssh -t ou ssh -tt pour que pty soit alloué lors de la connexion à l'aide de ssh:

J'ai eu beaucoup de plaisir à exécuter correctement les commandes en raison de ptys lors de l'exécution de sessions comme celle-ci: jenkins Shell -> pilote ssh -> ssh test -> docker exec. Bonne réponse ici: https://unix.stackexchange.com/questions/105422/command-must-be-run-from-a-terminal

"Essayez l'option -t pour ssh. Si cela ne fonctionne pas, essayez -tt."

"-t Forcer l'allocation de pseudo-tty. Ceci peut être utilisé pour exécuter des programmes basés sur des écrans arbitraires sur une machine distante, ce qui peut s'avérer très utile, par exemple lors de l'implémentation de services de menu. tty local. "

REPONSE 2: utilise docker run -t ... et docker exec -it

Utilisez les options -t et -it pour allouer pty à votre session d’exécution de docker.

Également avec docker exec, vous pouvez simplement utiliser l'option -u pour vous connecter au conteneur en tant qu'utilisateur différent et éviter d'utiliser su. par exemple. 

$ docker exec -u root -it small_hypatia bash

Vous trouverez une bonne question et une réponse à ce sujet ici: https://github.com/docker/docker/issues/8631

REPONSE 3: utilisez python pour faire apparaître un pty dans votre shell

Un hack assez mignon :)

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:~# 
33
gaoithe

Cette solution fonctionne en utilisant la commande 'script' du package 'bsdutiles' qui installe un pty (un terminal). La commande 'sleep' est là pour empêcher l'envoi du mot de passe avant que la commande 'su' ne soit prête à le lire. La commande "tail" supprime la ligne de saisie "Password:" générée par "su".

 sh -c "sleep 1; echo rootpassword" | script -qc 'su -c whoami - root' | tail -n +2

Attention, le mot de passe root peut être vu de différentes manières (historique, ps,/proc /, etc ...). Lancez la commande avec un espace pour au moins éviter l'enregistrement de l'historique.

6
jcamdr

Si vous utilisez su-exec au lieu de su, le problème avec tty disparaît complètement car il appelle execvp directement au lieu de forger comme su.

Gosu est une autre alternative similaire.

0
hlovdal