Ich schreibe einige Skripte, um einige Dinge auf einem Server zu installieren, auf dem Debian 10 läuft.
Dies ist das Skript:
#!/usr/bin/env sh
address=$1
ssh -T $address <<EOF > /dev/null
DEBIAN_FRONTEND=noninteractive
sudo apt-get install --assume-yes docker.io
EOF
Wenn ich das Skript ausführe und als Parameter das "[email geschützt]" Ich erhalte folgende Ausgabe:
debconf: unable to initialize frontend: Dialog
debconf: (Dialog frontend will not work on a dumb terminal, an emacs shell buffer, or without a controlling terminal.)
debconf: falling back to frontend: Readline
debconf: unable to initialize frontend: Readline
debconf: (This frontend requires a controlling tty.)
debconf: falling back to frontend: Teletype
dpkg-preconfigure: unable to re-open stdin:
Meines Wissens DEBIAN_FRONTEND=noninteractive
soll dies verhindern, dass diese Warnungen angezeigt werden. Verstehe ich hier etwas falsch?
Ich habe auch versucht, die Befehle in ein Skript einzufügen und das Skript anstelle der Befehle auszuführen. Dann habe ich versucht, die Dokumente hier nicht zu verwenden, aber immer noch ohne Erfolg.
Antwort1
Das ist, was passiert:
- Auf der Remote-Seite startet der SSH-Server eine Shell. Die Shell verarbeitet Ihr von der lokalen Seite übertragenes Here-Dokument.
DEBIAN_FRONTEND=noninteractive
definiert eine Variable in der Shell. Die Variable wird nicht in die Umgebung exportiert. Sie ist nur dann eine Umgebungsvariable, wenn sie bereits eine Umgebungsvariable ist; höchstwahrscheinlich ist sie das nicht.- Die Shell erzeugt (oder führt aus)
sudo
. Nur Umgebungsvariablen werden übernommen,sudo
kennt also Ihre nichtDEBIAN_FRONTEND
. sudo
spawntapt-get
. Selbst wenn das Tool es wüssteDEBIAN_FRONTEND
, wäre es normal,sudo
die Umgebung seines untergeordneten Elements zu bereinigen, sodass es es sowiesoapt-get
nicht wüssteDEBIAN_FRONTEND
.
Um dies zu beheben, müssen Sie die Variable exportieren. Stattdessen DEBIAN_FRONTEND=noninteractive
müssen Sie senden
export DEBIAN_FRONTEND=noninteractive
zur Remote-Shell. Dann müssen Sie sicherstellen, sudo
dass es nicht ausgeblendet wird apt-get
. Sehen Sie sich diese Frage an:Wie behält man Umgebungsvariablen bei der Verwendung bei sudo
?Aus einer der Antworten:
Sie müssen
man sudo
sorgfältig lesen und auf die Flagge achten-E
. […]Hier ist das Zitat aus der Manpage:
-E
,--preserve-env
Gibt der Sicherheitsrichtlinie an, dass der Benutzer seine vorhandenen Umgebungsvariablen beibehalten möchte. Die Sicherheitsrichtlinie gibt möglicherweise einen Fehler zurück, wenn der Benutzer nicht über die Berechtigung zum Beibehalten der Umgebung verfügt.
In Ihrem Fall sieht das Dokument hier folgendermaßen aus:
export DEBIAN_FRONTEND=noninteractive
sudo -E apt-get install --assume-yes docker.io
In einer anderen Antwort wird eine Möglichkeit erwähnt, Variablen anzugeben, die ohne -E
: env_keep
in sudoers
der Datei überleben sollen. Ich werde hierauf nicht näher eingehen.
Eine weitere Methode: sudo
ermöglicht das Definieren von Variablen, indem diese zwischen sudo
und dem eigentlichen Befehl platziert werden, obwohl diese ebenfalls den durch die Sicherheitsrichtlinie auferlegten Beschränkungen unterliegen. Der folgende Codeausschnitt sollte (sofern die Richtlinie dies zulässt) auch ohne Export der Variablen funktionieren:
DEBIAN_FRONTEND=noninteractive
sudo DEBIAN_FRONTEND="$DEBIAN_FRONTEND" apt-get install --assume-yes docker.io
Beachten Sie, dass Sie bei here-document <<'EOF'
anstelle von <<EOF
die Variablenerweiterung auf der lokalen Seite verhindern müssen (oder Sie müssen escapen $
). Das wird kompliziert und die gute Nachricht ist, dass Sie die Variable in der Remote-Shell überhaupt nicht benötigen. In Ihrem Fall sollte dies ausreichen, um die richtige Variable für zu definieren apt-get
:
sudo DEBIAN_FRONTEND=noninteractive apt-get install --assume-yes docker.io
Und schließlich: Falls die Sicherheitsrichtlinie die Angabe dieser Variable nicht erlaubt, können Sie sudo
noch eine weitere Shell starten:
sudo sh -c 'DEBIAN_FRONTEND=noninteractive apt-get install --assume-yes docker.io'
Ich gehe jedoch davon aus, dass eine derart restriktive Richtlinie Sie von vornherein daran hindert, dorthin zu gelangen sh
, sodass der letzte Befehl möglicherweise keine praktische Bedeutung hat.sudo