Wie kann man zwei verschiedene ExecStart-Befehle bedingt in einer Systemd-Unit-Datei ausführen?

Wie kann man zwei verschiedene ExecStart-Befehle bedingt in einer Systemd-Unit-Datei ausführen?

Ich möchteFühren Sie bedingt eine der folgenden Aktionen aus:(oder beide) dieser Befehle in einemeinzelsystemd-Unit-Datei:

ExecStart=/usr/bin/ssh-keygen -t rsa -b 4096
ExecStart=/usr/bin/ssh-keygen -t ed25519 -a 32

Die erste würde unter diesen Bedingungen ausgeführt:

ConditionPathExists=|!/etc/ssh/ssh_host_rsa_key
ConditionPathExists=|!/etc/ssh/ssh_host_rsa_key.pub

Die zweite Option würde unter folgenden Bedingungen ausgeführt:

ConditionPathExists=|!/etc/ssh/ssh_host_ed25519_key
ConditionPathExists=|!/etc/ssh/ssh_host_ed25519_key.pub

Es könnten beide Schlüssel fehlen, oder nur einer, oder keiner von beiden. Wenn ein Schlüssel existiert, möchte ich ihn natürlich nicht neu generieren. Meine Frage bezieht sich auf SSH-Schlüssel, aber die Konzepte sollten auf alle systemd-Unit-Dateien anwendbar sein. Wenn es eine allgemeine Möglichkeit gibt, dies in Unit-Dateien zu tun, sollte es hier funktionieren (nehme ich an).

Der Hintergrund ist:

/usr/lib/systemd/system/sshd.servicebeinhaltet:

Wants=sshdgenkeys.service

Der Standardinhalt von /usr/lib/systemd/system/sshdgenkeys.serviceist:

[Unit]
Description=SSH Key Generation
ConditionPathExists=|!/etc/ssh/ssh_host_dsa_key
ConditionPathExists=|!/etc/ssh/ssh_host_dsa_key.pub
ConditionPathExists=|!/etc/ssh/ssh_host_ecdsa_key
ConditionPathExists=|!/etc/ssh/ssh_host_ecdsa_key.pub
ConditionPathExists=|!/etc/ssh/ssh_host_ed25519_key
ConditionPathExists=|!/etc/ssh/ssh_host_ed25519_key.pub
ConditionPathExists=|!/etc/ssh/ssh_host_rsa_key
ConditionPathExists=|!/etc/ssh/ssh_host_rsa_key.pub

[Service]
ExecStart=/usr/bin/ssh-keygen -A
Type=oneshot
RemainAfterExit=yes

Mein Problem mit dieser Unit-Datei istwenn ein Schlüsseltyp fehlt, werden alle neu generiert. Ich habe vor, DSA- und ECDSA-Schlüssel zu entfernen. Ich muss also nur zwei Schlüsseltypen überprüfen und möchte nur die spezifischen Schlüssel neu generieren, die fehlen, falls welche vorhanden sind.

Bitte geben Sie mir einen Vorschlag, wie dies erreicht werden kann. Ich habe hier eine verwandte, aber andere Frage:Wie entferne ich Optionen aus Systemd-Unit-Dateien (ohne sie zu überschreiben oder neue zu erstellen)?. Diese beiden Fragen sind unabhängig voneinander und betreffen unterschiedliche Aspekte der Arbeit mit Unit-Dateien. Bei dieser Frage geht es um die bedingte Ausführung verschiedener Befehle, bei der anderen Frage um das Entfernen von Standardoptionen aus Unit-Dateien.

Antwort1

Die Bedingungen gelten nur für die gesamte Einheit, nicht für einzelne Stellenbeschreibungen darin.

Um einige der Jobs bedingt auszuführen, sollten diese Jobspezifikationen die Prüfung selbst durchführen, bevor die endgültige Aktion ausgeführt wird.

zB so:(Nicht getestet, nur online geschrieben)

ExecStart=bash -c \
'\
  if test ! -f /etc/ssh/ssh_host_rsa_key -o ! -f /etc/ssh/ssh_host_rsa_key.pub; then\
    /usr/bin/ssh-keygen -t rsa -b 4096;\
  fi\
' 'my-rsa-key-gen'
ExecStart=bash -c \
'\
  if test ! -f /etc/ssh/ssh_host_ed25519_key -o ! -f /etc/ssh/ssh_host_ed25519_key.pub; then\
    /usr/bin/ssh-keygen -t ed25519 -a 32;\
  fi\
' 'my-ed25519-key-gen'
1. Das `$$` soll verhindern, dass systemd das `$` selbst interpretiert.\ Aus dem `man systemd.service`-Abschnitt „Befehlszeilen“:
Um ein wörtliches Dollarzeichen zu übergeben, verwenden Sie „$$“.
2. Die impliziten „exit“-Befehle sollen den Status von „ssh-keygen“ zurückgeben bzw. einen Ausfall der Einheit verhindern.

Für optimale Ergebnisse und Benutzerfreundlichkeit würde ich empfehlen, ein externes Skript zu erstellen, um alle bedingten Ausführungen an einem Ort durchzuführen.

verwandte Informationen