Brak dokumentu TTY podczas uruchamiania poleceń przez SSH w dokumencie tutaj

10

Próbuję uruchomić komendę SSH w następujący sposób w dokumencie tutaj:

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

Co normalnie działa, z wyjątkiem sytuacji, gdy próbuję uruchomić coś, co wymaga wprowadzenia, na przykład hasło do sudo. W takim przypadku otrzymuję następujący komunikat:

sudo: no tty present and no askpass program specified

Wiem, że mogę użyć -tflagi w SSH, aby przydzielić pseudo-tty, takie jak to:

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

I to zadziała, ale kiedy spróbuję tego samego z dokumentem tutaj, to nie działa i otrzymam ten sam błąd o braku obecności tty:

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

Masz pomysł, jak sprawić, by to działało?

Ponadto, jeśli zastanawiasz się, dlaczego chcę, aby działał z niniejszym dokumentem zamiast po prostu przekazywać go w tym samym wierszu, dzieje się tak, ponieważ polecenia wejściowe (może być kilka) pochodzą z pliku konfiguracyjnego odczytanego przez skrypt i słyszałem, że unika się kłopotów z unikaniem poleceń dla cudzysłowów, podwójnych cudzysłowów itp.

lpfavreau
źródło

Odpowiedzi:

6

Użyj visudodo edycji pliku sudoers i wstaw poniższy wiersz:

Defaults:<user>    !requiretty

Nie odpowiada, dlaczego korzystanie z ssh -t "something" versus ssh -t <<STOP something STOPnie działa. Powiedzmy, że nie używam sudo, ale używam passwd bezpośrednio dla mojego użytkownika, nadal nie otrzymam TTY za pomocą heredoc.

Spróbuj ssh -t -twymusić alokację pseudo-tty, nawet jeśli stdin nie jest terminalem.

kwanty
źródło
Dzięki, widziałem tę poprawkę gdzie indziej, ale dotyczy ona tylko problemu z poleceniami używającymi sudo. Nie odpowiada, dlaczego użycie ssh -t „coś” kontra ssh -t << STOP coś STOP nie działa. Powiedzmy, że nie używam sudo, ale używam passwd bezpośrednio dla mojego użytkownika, nadal nie otrzymam TTY za pomocą heredoc.
lpfavreau
Zaktualizowałem swoją odpowiedź.
kwanty
1

Dlaczego nie po prostu zapisać tutaj dokument w zmiennej, która zostanie podana ssh -tjako argument polecenia.

Mówiąc bardziej ogólnie, użyj ssh -Tlub określ zdalną powłokę jako argument polecenia, jeśli stdin zdalnego hosta jest przekierowywany z heredoc (aby zapobiec sshpróbie alokacji 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
Czad
źródło