하나의 시스템 단위 파일에서 두 개의 서로 다른 ExecStart 명령을 조건부로 실행하는 방법은 무엇입니까?

하나의 시스템 단위 파일에서 두 개의 서로 다른 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 키에 관한 것이지만 개념은 모든 시스템 단위 파일에 적용 가능해야 합니다. 유닛 파일에 이 작업을 수행하는 일반적인 방법이 있다면 여기서는 작동할 것입니다(제 생각에는).

배경은 다음과 같습니다

/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 키를 제거할 계획입니다. 따라서 두 가지 키 유형만 확인하면 되며, 누락된 특정 키만 재생성하고 싶습니다.

이것이 어떻게 이루어질 수 있는지 추천해주세요. 여기에 관련되어 있지만 다른 질문이 있습니다.시스템 단위 파일에서 옵션을 제거(재정의하지 않고 새로 생성하지 않음)하는 방법은 무엇입니까?. 이 두 가지 질문은 독립적이며 단위 파일 작업의 다양한 측면을 포함합니다. 이 질문은 조건부로 다른 명령을 실행하는 것에 관한 것이고, 다른 질문은 유닛 파일에서 표준 옵션을 제거하는 것에 관한 것입니다.

답변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' 상태를 반환하고 장치 오류를 방지하는 것입니다.

최상의 결과를 쉽게 얻으려면 모든 조건부 실행을 한 곳에서 수행하는 외부 스크립트를 만드는 것이 좋습니다.

관련 정보