2016-04-29 8 views
13

Sto sviluppando un ambiente mobile per scopi didattici e devo essere in grado di passare gli utenti all'interno della finestra mobile.Il comando 'su' in Docker restituisce 'deve essere eseguito dal terminale'

Ho impostato l'utente "utente" con una password, ma quando provo a passare ad esso con su, ottengo "su deve essere eseguito dal terminale".

Ottengo questo se provo a ssh nella finestra mobile e anche impartendo comandi tramite una shell php (un servizio Apache è in esecuzione sull'istanza Docker).

Qualsiasi aiuto è molto apprezzato.

+1

Sarei interessato a saperne di più sul vostro caso d'uso/configurazione. L'esecuzione di SSH nel contenitore è un anti-pattern. Hai bisogno di cambiare utente al volo (mentre sei nel contenitore?) O come parte di un processo di compilazione (usando un Dockerfile?). – johnharris85

+1

Se Google questo messaggio di errore, ci sono diverse soluzioni. –

+0

Grazie, l'aiuto effettivo di warmoverflow sarebbe apprezzato. Ho trovato una soluzione alternativa per eseguire python ma sarebbe necessaria una soluzione coerente. – SaintHUN

risposta

24

Quando si esegue ssh-in o si passa tramite php, alla sessione non viene assegnata una pty. Ho usato ciascuna delle seguenti soluzioni:

RISPOSTA 1: uso ssh -t o ssh -tt per ottenere Pty allocato quando si accede usando ssh:

Mi sono divertito molto ottenere i comandi da eseguire a destra a causa a ptys quando si eseguono sessioni come questa: jenkins shell -> ssh driver -> ssh test -> docker exec. Buona risposta qui: https://unix.stackexchange.com/questions/105422/command-must-be-run-from-a-terminal

"Prova l'opzione -t per ssh Se questo non funziona provare -tt.".

"allocazione pseudo-tty Forza -t. Questo può essere usato per eseguire programmi telematici arbitrari su un computer remoto, che può essere molto utile, ad esempio quando l'implementazione di servizi di menu. Opzioni -t multipla allocazione forza tty, anche se ssh non ha locale tty. "

RISPOSTA 2: uso finestra mobile run -t ... e finestra mobile exec -E

Utilizzare i -t e opzioni -it allocare Pty nella sessione finestra mobile exec.

Anche con exec docker è possibile utilizzare semplicemente l'opzione -u per accedere al contenitore come utenti diversi ed evitare l'uso di su. per esempio.

$ docker exec -u root -it small_hypatia bash 

C'è una buona domanda e risposta su questo qui: https://github.com/docker/docker/issues/8631

RISPOSTA 3: uso python per deporre le uova un pty nel tuo guscio

Un bel trucco cute :)

[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

Answer 2 ha funzionato perfettamente per me. Grazie. –

+1

Stavo cercando la risposta 2 (ambiente docker) - funziona! – Pixelartist

+0

All'interno di un container solo 3 lavora per me – 4xy

4

Questa soluzione funziona utilizzando il comando "script" del pacchetto "bsdutiles" che imposta un pty (un terminale). Il comando 'sleep' è lì per impedire l'invio della password prima che il comando 'su' sia pronto a leggerlo. Il comando 'tail' rimuove la riga di input "Password:" emessa da 'su'.

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

Attenzione che la rootpassword potrebbe essere vista in molti modi (cronologia, ps,/proc /, ecc ...). Avvia il comando con uno spazio per evitare almeno la registrazione della cronologia.

0

Se si utilizza su-exec anziché su il numero wi la tty svanisce completamente poiché chiama execvp direttamente invece di biforcarsi come fa su.

Gosu è un'altra alternativa simile.

Problemi correlati