Как условно выполнить две разные команды ExecStart в одном файле модуля systemd?

Как условно выполнить две разные команды ExecStart в одном файле модуля systemd?

Я хочуусловно выполнить одно из(или обе) эти команды водинокийФайл модуля systemd:

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

Первый вариант будет реализован на следующих условиях:

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

Второй вариант будет реализован при следующих условиях:

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

Оба ключа могут отсутствовать, или только один, или ни один. Очевидно, что если ключ существует, я не хочу его повторно генерировать. Мой вопрос касается ключей ssh, но эти концепции должны быть применимы к любым файлам юнитов systemd. Если есть общий способ сделать это в файлах юнитов, он должен работать здесь (я предполагаю).

Предыстория такова:

/usr/lib/systemd/system/sshd.serviceвключает в себя:

Wants=sshdgenkeys.service

Стандартное содержимое /usr/lib/systemd/system/sshdgenkeys.service:

[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

Моя проблема с этим файлом блока заключается в следующем:при отсутствии любого типа ключа все генерируются заново. Я планирую удалить ключи dsa и ecdsa. Поэтому мне нужно проверить только два типа ключей, и я хочу только восстановить конкретные ключи, которые отсутствуют, если таковые имеются.

Пожалуйста, порекомендуйте, как это можно сделать. У меня есть связанный, но другой вопрос:Как удалить (не переопределить и не создать новые) параметры из файлов модулей systemd?. Эти два вопроса независимы и затрагивают различные аспекты работы с файлами юнитов. Этот вопрос касается условного выполнения различных команд, другой вопрос касается удаления стандартных опций из файлов юнитов.

решение1

Условия применяются только ко всему подразделению, а не к отдельным должностным инструкциям внутри него.

Таким образом, для условного выполнения некоторых работ эти спецификации работ должны сами выполнять проверку перед выполнением заключительного действия.

например, так:(Не проверял, просто пишу онлайн)

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. `$$` предназначен для того, чтобы не дать systemd интерпретировать сам `$`. Из раздела `man systemd.service` "Командные строки":
Чтобы передать буквальный знак доллара, используйте «$$».
2. Неявные команды `exit` возвращают статус `ssh-keygen` и предотвращают сбой устройства соответственно.

Для достижения наилучших результатов и простоты я бы посоветовал создать внешний скрипт, который будет выполнять все условные выполнения в одном месте.

Связанный контент