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.
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]:~#
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.