如何在一個 systemd 單元檔案中有條件地執行兩個不同的 ExecStart 指令?

如何在一個 systemd 單元檔案中有條件地執行兩個不同的 ExecStart 指令?

我想要有條件地執行其中之一(或兩者)這些命令在單身的系統單元檔案:

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

條件僅適用於整個單位,不適用於其中的個別工作規範。

因此,為了有條件地執行某些作業,這些作業規範應該在執行它們的最終操作之前自行檢查。

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 解釋 `$` 本身。
若要傳遞文字美元符號,請使用“$$”。
2. 隱式「exit」指令分別是回傳「ssh-keygen」的狀態並防止裝置失敗。

為了獲得最佳結果和簡便性,我建議建立一個外部腳本來在一個地方執行所有條件執行。

相關內容