2016-04-29 9 views
13

Zajmuję się środowiskiem dokowanego do celów dydaktycznych i muszę mieć możliwość przełączania użytkowników w oknie dokowanym.Polecenie "su" w Docker zwraca "musi być uruchamiane z terminala"

Ustawiam hasło użytkownika "użytkownika", ale kiedy spróbuję przełączyć się na niego su, otrzymuję polecenie "su musi być uruchamiane z terminala".

Dostaję to, jeśli próbuję ssh do dockera, a także wydając polecenia przez powłokę php (usługa apache działa na instancji Docker).

Każda pomoc jest doceniana.

+1

Chciałbym dowiedzieć się więcej o Twoim przypadku użycia/konfiguracji. Uruchamianie SSH w kontenerze to anty-wzór. Czy chcesz zmienić użytkownika w locie (gdy jesteś "w" kontenerze?) Lub jako część procesu kompilacji (używając pliku Dockerfile?). – johnharris85

+1

Jeśli Google wyświetli ten komunikat o błędzie, istnieje kilka rozwiązań. –

+0

Dziękuję Ci za pomoc odświeżania ciepła. Znalazłem obejście z pytonem, ale potrzebowałem spójnego rozwiązania. – SaintHUN

Odpowiedz

24

Kiedy wchodzisz lub wchodzisz przez php, sesja nie jest przydzielana pty. Użyłem każdej z następujących rozwiązań:

Odpowiedź 1: ssh -t lub ssh -tT aby pty przydzielane podczas logowania ssh:

miałem wielką zabawę z dostaniem poleceń uruchomić prawy powodu do ptys podczas uruchamiania sesji takich jak ta: powłoka jenkinsa -> sterownik ssh -> test ssh -> execer exec. Dobra odpowiedź tutaj: https://unix.stackexchange.com/questions/105422/command-must-be-run-from-a-terminal

"Wypróbuj opcję -t dla ssh. Jeśli to nie działa, spróbuj -tt."

"-t Wymuś alokację pseudo-tty, która może być użyta do wykonania dowolnych programów ekranowych na zdalnym komputerze, co może być bardzo przydatne, np. Przy wdrażaniu usług menu. Wiele opcji -t wymusza alokację tty, nawet jeśli ssh nie ma lokalnego tty. "

ODPOWIEDŹ 2: Zastosowanie doker run -t ... i doker Exec -To

pomocą -t i opcje -it przydzielić pty w sesji doker Exec.

Również z funkcją dokowania exec można po prostu użyć opcji -u, aby zalogować się do kontenera jako inni użytkownicy i unikać używania su. na przykład

$ docker exec -u root -it small_hypatia bash 

Jest to dobre pytanie i odpowiedź na ten temat tutaj: https://github.com/docker/docker/issues/8631

ODPOWIEDŹ 3: Zastosowanie pyton na tarło do pty w swojej skorupie

Całkiem ładny Hack :)

jenkin[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]:~# 
+2

Odpowiedź 2 działała idealnie dla mnie. Dziękuję Ci. –

+1

Szukałem odpowiedzi 2 (środowisko dokowane) - działa! – Pixelartist

+0

Wewnątrz kontenera tylko 3 działa dla mnie – 4xy

4

To rozwiązanie działa za pomocą polecenia "script" z pakietu "bsdutiles", który konfiguruje pty (terminal). Polecenie "uśpienia" służy do zapobiegania wysyłaniu hasła, zanim polecenie "su" będzie gotowe do odczytu. Polecenie "ogon" usuwa wiersz wejściowy "Hasło:" wydany przez "su".

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

Pamiętaj, że rootpassword może być widoczny na wiele sposobów (history, ps,/proc /, etc ...). Uruchom polecenie spacją, aby przynajmniej uniknąć zapisywania historii.

0

Jeśli używasz su-exec zamiast su problem z th tty całkowicie znika, ponieważ wywołuje execvp bezpośrednio zamiast rozwidlenia, tak jak robi to su.

Gosu to kolejna alternatywna alternatywa.

Powiązane problemy