시스템 단위 파일에서 두 개의 서로 다른 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" 상태를 반환하고 장치 오류를 방지합니다.

최상의 결과와 단순성을 위해 모든 조건부 실행을 한 곳에서 수행하는 외부 스크립트를 만드는 것이 좋습니다.

관련 정보