システム単位ファイルで2つの異なるExecStartコマンドを条件付きで実行する方法は?

システム単位ファイルで2つの異なるExecStartコマンドを条件付きで実行する方法は?

欲しいそのうちの1つを条件付きで実行する(またはその両方)このコマンドは、以下にあります。一つシステムデバイスファイル:

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

2番目のジョブは、次の条件で実行されます。

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

両方のキーを失うことも、1つだけを失うことも、両方のキーを失うこともあります。明らかにキーが存在する場合、キーを再生成したくありません。私の質問はSSHキーに関するものですが、概念はすべてのシステム単位ファイルに適用する必要があります。ユニットファイルでこれを行う一般的な方法がある場合は、ここで動作します(私の考えでは)。

背景は次のとおりです

/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 キーを削除する予定です。したがって、2つのキータイプのみを確認するだけで、欠落している特定のキーのみを再生成したいと思います。

これを達成する方法を提案します。ここに関連していますが、他に質問があります。システム単位のファイルからオプションを削除する(上書きせずに新しく作成せずに)方法は?。これら2つの質問は独立しており、処理単位ファイルのさまざまな側面が含まれています。この質問は条件付きで別のコマンドを実行することに関するものであり、他の質問はユニットファイルから標準オプションを削除することです。

答え1

条件はデバイス全体にのみ適用され、デバイス内の個々の作業仕様には適用されません。

したがって、特定のジョブを条件付きで実行するには、最終ジョブを実行する前にそのジョブの仕様を独自に確認する必要があります。

fe.fe.このように:(テストしたことはなく、ただオンラインに書いています)

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" 状態を返し、デバイスエラーを防ぎます。

最良の結果と単純さのために、すべての条件付き実行を1箇所で実行する外部スクリプトを作成することをお勧めします。

関連情報