Debuggen von Preseed/Late_Command für Ubuntu 16.04-Server: Tee nicht gefunden vs. nicht vorhandenes Verzeichnis

Debuggen von Preseed/Late_Command für Ubuntu 16.04-Server: Tee nicht gefunden vs. nicht vorhandenes Verzeichnis

Ich versuche, die folgende Preseed-Datei auf einem Ubuntu 16.04-Servercomputer auszuführen (während eines Packer-Builds):

d-i preseed/late_command string \
in-target mkdir -v -p -m 0440 "/etc/sudoers.d"; \
in-target echo "%vagrant ALL=(ALL) NOPASSWD: ALL" | tee -a /etc/sudoers.d/vagrant; \
in-target echo "Defaults:vagrant !requiretty" | tee -a /etc/sudoers.d/vagrant; \
in-target chmod 440 /etc/sudoers.d/vagrant;

In /var/log/installer/syslog wird mir der folgende Fehler angezeigt:

log-output: sh:
log-output: tee: not found

Wenn ich den Teil „| tee -a“ in ">>" ändere, wie folgt:

d-i preseed/late_command string \
in-target mkdir -v -p -m 0440 "/etc/sudoers.d"; \
in-target echo "%vagrant ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers.d/vagrant; \
in-target echo "Defaults:vagrant !requiretty" >> /etc/sudoers.d/vagrant; \
in-target chmod 440 /etc/sudoers.d/vagrant;

Plötzlich beginnt es sich zu beschweren, dass es das Verzeichnis nicht finden kann, ohne etwas über die Zeile mkdir zu sagen – es erstellt also weder das Verzeichnis noch findet es es nicht:

log-output: sh: can't create /etc/sudoers.d/vagrant: nonexistent directory
log-output: sh: can't create /etc/sudoers.d/vagrant: nonexistent directory
log-output: chmod:
log-output: cannot access '/etc/sudoers.d/vagrant'
log-output: : No such file or directory

Ich habe mir andere Skripte auf GitHub angesehen. Außerdem habe ich der Datei preseed.cfg die folgende Zeile hinzugefügt:

d-i pkgsel/include string openssh-server coreutils wget sudo

Ich habe sogar versucht, Coreutils als In-Target-Befehl zu installieren, um sicherzustellen, dass Tee verfügbar sein sollte. Ich bin jetzt seit ein paar Tagen dabei, baue Ubuntu immer wieder neu auf, nur um die gleichen Fehler im Syslog zu finden. Wenn jemand Licht in die Sache bringen könnte – es muss etwas Einfaches sein, aber ich sehe es nicht …

Antwort1

Zwei Dinge:

  1. Dabei in-target some_command > /some/patherfolgt die Umleitung NICHT innerhalb des Ziels. Sie müssen Folgendes tun:in-target --pass-stdout some_command > /target/some/path

  2. Der in-targetBefehl leitet die Ausgabe des Befehls in die Protokolldatei um. Der Versuch, die Ausgabe umzuleiten, in-targetfunktioniert daher standardmäßig nicht. Sie müssen das --pass-stdoutArgument in-target verwenden.

in-target --pass-stdout echo "hello" > /target/root/hello.txt

Dadurch wird eine Datei /target/root/hello.txt mit dem Inhalt „Hallo“ erstellt.

Aus:https://salsa.debian.org/installer-team/debian-installer-utils/-/blob/3e67bc7987eb4a9cdff5fe8d1084e612fe7bb48f/README

in-target: Führt den angegebenen Befehl in /target aus und gibt seinen Beendigungsstatus zurück. Das Debconf-Passthrough-Frontend wird verwendet, um Debconf-Fragen mit cdebconf im Installationsprogramm zu stellen. Dies ist besonders nützlich, um Dinge wie dpkg-reconfigure, debconf-apt-progress und tasksel auszuführen. Das Dienstprogramm log-output wird verwendet, um alle Ausgaben zu protokollieren; wenn in-target mit der Option --pass-stdout aufgerufen wird, wird log-output dies berücksichtigen.

Antwort2

echoDie Verwendung von into scheint nicht zu funktionieren in-target. Um dieses Problem zu lösen, versuchen Sie Folgendes (ausprobiert in Ubuntu 18.04):

d-i preseed/late_command string \
    echo "some text" >> /target/path/to/file.ext ; \
    in-target [some-other-command-in-target]

NOTIZ:

  • Nicht in-targetvor der Zeile verwenden
  • /targetVor dem tatsächlichen Pfad verwenden
  • In anderen Befehlen können Sie meistens in-targetvor der Zeile verwenden

Antwort3

Wenn Sie lieber das Debian-Installationsprogramm verwenden möchten, hat dies bei mir auf dem Server 17.10.1 funktioniert, als ich einen öffentlichen SSH-Schlüssel zu authorized_keys hinzugefügt habe. Sie müssen sicherstellen, dass das .ssh-Verzeichnis vorher erstellt wird.

d-i preseed/late_command string in-target /bin/sh -c 'echo "my string" >> /home/username/.ssh/authorized_keys';

Ich habe etwa einen Tag damit verbracht, dies zu debuggen, und Folgendes mit unterschiedlichen Ergebnissen versucht. Es wäre schön, wenn es eine detailliertere Dokumentation darüber gäbe, welche Shell im Debian-Installer für die verschiedenen Nicht-/„In-Target“-Direktiven verwendet wird, aber ich suche wahrscheinlich nicht an der richtigen Stelle.

  1. einfaches In-Target-Echo mit einfachem authorized_keys-Pfad:

    in-target echo "my string" >> /home/username/.ssh/authorized_keys;
    

    gibt "Verzeichnis nicht gefunden" in/var/log/installer/syslog

  2. einfaches In-Target-Echo mit Zielpfad „authorized_keys“:

    in-target echo "my string" >> /target/home/username/.ssh/authorized_keys;
    

    erzeugt eine leere authorized_keys Datei auf dem Zielrechner und beim Betrachten /var/log/installer/syslogfinden Sie "my string" wird ausgegeben anstdout

  3. im Ziel mit explizitem sh -c...und Zielpfad für autorisierte Schlüssel:

    in-target /bin/sh -c 'echo "my string" >> /target/home/username/.ssh/authorized_keys';
    

    erzeugt einen "Verzeichnis nicht gefunden"-Fehler in/var/log/installer/syslog

Hoffentlich spart dies etwas Zeit und Fehlerbehebung!

Antwort4

echo funktioniert innerhalb einer in-target-Direktive. Sie müssen es mit Backticks (`) versehen. Ich wollte beispielsweise den Hostnamen meiner Maschine aus der Preseed-Datei aktualisieren:

In-Ziel-Hostnameecho "ubn"$(lshw | grep -m 1 serial | awk '{print tolower ($2)}')

Backticks weisen die Shell an, dies als einen Befehl auszuführen.

verwandte Informationen