Kein TTY vorhanden, wenn Befehle über SSH in diesem Dokument ausgeführt werden


10

Ich versuche, einen Befehl über SSH wie folgt in einem Here-Dokument auszuführen:

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

Was normalerweise funktioniert, außer wenn ich versuche, etwas auszuführen, das eingegeben werden muss, wie z. B. das Passwort für sudo. In diesem Fall erhalte ich folgende Meldung:

sudo: no tty present and no askpass program specified

Ich weiß, dass ich das -tFlag auf SSH verwenden kann, um eine Pseudo-Tty wie diese zuzuweisen:

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

Und es wird funktionieren, aber wenn ich dasselbe mit here-document versuche, funktioniert es nicht und ich erhalte den gleichen Fehler, wenn kein tty vorhanden ist:

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

Irgendeine Idee, wie ich diese Arbeit machen kann?

Falls Sie sich fragen, warum ich möchte, dass es mit dem Here-Dokument funktioniert, anstatt es nur in derselben Zeile zu übergeben, liegt dies daran, dass die Eingabebefehle (es kann einige geben) aus einer Konfigurationsdatei stammen, die von einem Skript gelesen wird und ich habe gehört, dass es die Mühe vermeidet, den Befehlen für Anführungszeichen, doppelte Anführungszeichen usw. zu entkommen.

Antworten:


6

Verwenden Sie visudodiese Option, um die Sudoers-Datei zu bearbeiten und eine der folgenden Zeilen einzufügen:

Defaults:<user>    !requiretty

Es antwortet nicht, warum die Verwendung von ssh -t "something" versus ssh -t <<STOP something STOPnicht funktioniert. Angenommen, ich verwende kein sudo, aber ich verwende passwd direkt für meinen eigenen Benutzer. Ich bekomme das TTY immer noch nicht mit dem Heredoc.

Versuchen Sie ssh -t -t, die Pseudo-Tty-Zuweisung zu erzwingen, auch wenn stdin kein Terminal ist.


Vielen Dank, ich habe dieses Update an anderer Stelle gesehen, aber es geht nur um das Problem für die Befehle, die sudo verwenden. Es antwortet nicht, warum die Verwendung von ssh -t "etwas" im Vergleich zu ssh -t << STOP etwas STOP nicht funktioniert. Angenommen, ich verwende kein sudo, aber ich verwende passwd direkt für meinen eigenen Benutzer. Ich bekomme das TTY immer noch nicht mit dem Heredoc.
lpfavreau

Ich habe meine Antwort aktualisiert.
Quanten

1

Speichern Sie das Dokument hier einfach in einer Variablen, die ssh -tals Befehlsargument angegeben wird.

Verwenden Sie im Allgemeinen ssh -Tdie Remote-Shell als Befehlsargument , oder geben Sie sie an, wenn der Standard des Remote-Hosts von einem Heredoc umgeleitet wird (um zu verhindern, dass sshversucht wird, eine Pty zuzuweisen).

# 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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.