Debian 10 über SSH ignoriert „DEBIAN_FRONTEND=noninteractive“

Debian 10 über SSH ignoriert „DEBIAN_FRONTEND=noninteractive“

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=noninteractivesoll 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:

  1. Auf der Remote-Seite startet der SSH-Server eine Shell. Die Shell verarbeitet Ihr von der lokalen Seite übertragenes Here-Dokument.
  2. DEBIAN_FRONTEND=noninteractivedefiniert 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.
  3. Die Shell erzeugt (oder führt aus) sudo. Nur Umgebungsvariablen werden übernommen, sudokennt also Ihre nicht DEBIAN_FRONTEND.
  4. sudospawnt apt-get. Selbst wenn das Tool es wüsste DEBIAN_FRONTEND, wäre es normal, sudodie Umgebung seines untergeordneten Elements zu bereinigen, sodass es es sowieso apt-getnicht wüsste DEBIAN_FRONTEND.

Um dies zu beheben, müssen Sie die Variable exportieren. Stattdessen DEBIAN_FRONTEND=noninteractivemüssen Sie senden

export DEBIAN_FRONTEND=noninteractive

zur Remote-Shell. Dann müssen Sie sicherstellen, sudodass 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 sudosorgfä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_keepin sudoersder Datei überleben sollen. Ich werde hierauf nicht näher eingehen.

Eine weitere Methode: sudoermöglicht das Definieren von Variablen, indem diese zwischen sudound 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 <<EOFdie 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 sudonoch 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

verwandte Informationen