我想要有條件地執行其中之一(或兩者)這些命令在單身的系統單元檔案:
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'
若要傳遞文字美元符號,請使用“$$”。2. 隱式「exit」指令分別是回傳「ssh-keygen」的狀態並防止裝置失敗。
為了獲得最佳結果和簡便性,我建議建立一個外部腳本來在一個地方執行所有條件執行。