Nessun TTY presente durante l'esecuzione di comandi su SSH nel documento qui


10

Sto cercando di eseguire un comando su SSH in questo modo in un documento qui:

ssh example.com <<END
sudo /etc/init.d/apache2 reload
END

Che normalmente funziona tranne quando sto cercando di eseguire qualcosa che necessita di input, come la password per sudo. In tal caso, ricevo il seguente messaggio:

sudo: no tty present and no askpass program specified

So di poter usare il -tflag su SSH per allocare una pseudo-tty come questa:

ssh -t example.com "sudo /etc/init.d/apache2 reload"

E funzionerà, ma quando provo la stessa cosa con here-document, non funziona e otterrò lo stesso errore per l'assenza di tty:

ssh -t example.com <<END
sudo /etc/init.d/apache2 reload
END

Qualche idea su come posso farlo funzionare?

Inoltre, nel caso ti stia chiedendo perché voglio che funzioni con il documento here invece di passarlo sulla stessa riga, è perché i comandi di input (possono essercene alcuni) provengono da un file di configurazione letto da uno script e ho sentito che evita il problema di sfuggire ai comandi per le virgolette, le virgolette doppie, ecc.

Risposte:


6

Utilizzare visudoper modificare il file sudoers e inserire una riga di seguito:

Defaults:<user>    !requiretty

Non risponde al motivo per cui l'utilizzo di ssh -t "something" versus ssh -t <<STOP something STOPnon funziona. Diciamo che non sto usando sudo ma sto usando direttamente passwd per il mio utente, non riesco ancora a ottenere il TTY usando l'ereditarietà.

Prova ssh -t -ta forzare l'allocazione pseudo-tty anche se stdin non è un terminale.


Grazie, ho visto questa correzione altrove, ma risolve il problema solo con i comandi che usano sudo. Non risponde perché usare ssh -t "qualcosa" contro ssh -t << STOP qualcosa STOP non funziona. Diciamo che non sto usando sudo ma sto usando direttamente passwd per il mio utente, non riesco ancora a ottenere il TTY usando l'ereditarietà.
lpfavreau,

Ho aggiornato la mia risposta.
quanti,

1

Perché non archiviare semplicemente il documento qui in una variabile che verrà fornita ssh -tcome argomento di comando.

In una nota più generale, utilizzare ssh -To specificare la shell remota come argomento del comando se lo stdin dell'host remoto viene reindirizzato da un heredoc (per evitare sshdi tentare di allocare un pty).

# store heredoc in a variable
heredoc="$(cat <<EOF
who
sudo ls -ld /
logname
EOF
)"

ssh -t localhost "$heredoc"


# avoid: Pseudo-terminal will not be allocated because stdin is not a terminal.
- ssh example.com <<END
+ ssh -T example.com <<END
+ ssh example.com /bin/sh <<END
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.