it-swarm.com.de

'su' Befehl in Docker Returns 'muss vom Terminal ausgeführt werden'

Ich entwickle eine Docker-Umgebung für Unterrichtszwecke und muss in der Lage sein, Benutzer innerhalb des Dockers zu wechseln.

Ich habe den Benutzer 'user' mit einem Passwort eingerichtet, aber wenn ich versuche, mit su zu wechseln, erhalte ich "su muss vom Terminal ausgeführt werden".

Ich bekomme dies, wenn ich versuche, ssh in das Docker zu setzen, und auch, indem ich Befehle über eine PHP-Shell ausstelle.

Jede Hilfe wird sehr geschätzt.

17
ptr0x01

Wenn Sie in PHP einsteigen oder dort einsteigen, wird Ihrer Sitzung kein Pty zugewiesen. Ich habe jede der folgenden Lösungen verwendet:

ANSWER 1: Verwenden Sie ssh -t oder ssh -tt, um pty zuzuweisen, wenn Sie sich mit ssh anmelden:.

Ich hatte großen Spaß daran, Befehle zu erhalten, die aufgrund von ptys beim Ausführen von Sitzungen wie folgt ausgeführt wurden: jenkins Shell -> ssh-Treiber -> ssh test -> Docker-Exec. Gute Antwort hier: https://unix.stackexchange.com/questions/105422/command-must-be-run-from-a-terminal

"Probieren Sie die Option -t für ssh aus. Wenn dies nicht funktioniert, versuchen Sie -tt."

"-t Pseudo-tty-Zuweisung erzwingen. Dies kann verwendet werden, um beliebige bildschirmbasierte Programme auf einer Remote-Maschine auszuführen, was sehr nützlich sein kann, z. B. beim Implementieren von Menü-Services lokales tty. "

ANSWER 2: Docker-Run -t ... und Docker-Exec -it verwenden

Verwenden Sie die Optionen -t und -it, um pty in Ihrer Docker-Exec-Sitzung zuzuweisen.

Mit Docker-Exec können Sie auch einfach die Option -u verwenden, um sich als unterschiedliche Benutzer bei Container anzumelden und die Verwendung von su zu vermeiden. z.B. 

$ docker exec -u root -it small_hypatia bash

Hier gibt es eine gute Frage und Antwort: https://github.com/docker/docker/issues/8631

ANSWER 3: Verwenden Sie Python, um ein Pty in Ihrer Shell zu erzeugen

Ziemlich süßer Hack :)

[email protected]:~$ su -
su: must be run from a terminal

$ echo "import pty; pty.spawn('/bin/bash')" > /tmp/asdf.py
$ python /tmp/asdf.py

$ su -
Password: 

[email protected]:~# 
33
gaoithe

Diese Lösung funktioniert mit dem Befehl 'script' aus dem Paket 'bsdutiles', mit dem ein pty (ein Terminal) eingerichtet wird. Der Befehl 'sleep' verhindert, dass das Passwort gesendet wird, bevor der Befehl 'su' zum Lesen bereit ist. Der Befehl 'tail' entfernt die von 'su' ausgegebene Eingabezeile "Password:".

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

Beachten Sie, dass das Rootkennwort auf verschiedene Weise angezeigt werden kann (Verlauf, ps,/proc/usw.). Starten Sie den Befehl mit einem Leerzeichen, um die Historienaufzeichnung zumindest zu vermeiden.

6
jcamdr

Wenn Sie su-exec anstelle von su verwenden, ist das Problem mit tty vollständig verschwunden, da es execvp direkt aufruft und nicht wie su fälscht.

Gosu ist eine ähnliche Alternative.

0
hlovdal