Я хочуусловно выполнить одно из(или обе) эти команды водинокийФайл модуля 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'
Чтобы передать буквальный знак доллара, используйте «$$».2. Неявные команды `exit` возвращают статус `ssh-keygen` и предотвращают сбой устройства соответственно.
Для достижения наилучших результатов и простоты я бы посоветовал создать внешний скрипт, который будет выполнять все условные выполнения в одном месте.