Como executar condicionalmente dois comandos ExecStart diferentes em um arquivo de unidade systemd?

Como executar condicionalmente dois comandos ExecStart diferentes em um arquivo de unidade systemd?

Eu queroexecutar condicionalmente qualquer um dos(ou ambos) esses comandos em umsolteiroarquivo da unidade systemd:

ExecStart=/usr/bin/ssh-keygen -t rsa -b 4096
ExecStart=/usr/bin/ssh-keygen -t ed25519 -a 32

O primeiro seria executado nestas condições:

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

O segundo seria executado nestas condições:

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

Ambas as chaves podem estar faltando, ou apenas uma, ou nenhuma. Obviamente, se existir uma chave, não quero regenerá-la. Minha pergunta é em relação às chaves ssh, mas os conceitos devem ser aplicáveis ​​a qualquer arquivo de unidade do systemd. Se houver uma maneira genérica de fazer isso em arquivos de unidade, ela deverá funcionar aqui (presumo).

O pano de fundo é:

/usr/lib/systemd/system/sshd.serviceinclui:

Wants=sshdgenkeys.service

O conteúdo padrão de /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

Meu problema com esse arquivo de unidade équando qualquer tipo de chave está faltando, todos são gerados novamente. Pretendo remover as chaves dsa e ecdsa. Portanto, só preciso verificar dois tipos de chave e quero regenerar apenas as chaves específicas que estão faltando, se houver.

Por favor, recomende como isso pode ser feito. Tenho uma pergunta relacionada, mas diferente aqui:Como remover (não substituir, não criar novas) opções dos arquivos da unidade do systemd?. Essas duas questões são independentes e envolvem diferentes aspectos do trabalho com arquivos unitários. Esta questão é sobre a execução condicional de comandos diferentes, a outra questão é sobre a remoção de opções padrão dos arquivos de unidade.

Responder1

As condições aplicam-se apenas à unidade inteira e não às especificações de trabalho individuais dentro dela.

Portanto, para executar condicionalmente alguns dos trabalhos, essas especificações de trabalho devem fazer a verificação por conta própria antes de executar a ação final deles.

fe. assim:(Não testado, apenas escrevendo online)

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. O `$$` é para evitar que o systemd interprete o próprio `$`. Na seção `man systemd.service` "Linhas de comando":
Para passar um cifrão literal, use "$$".
2. Os comandos `exit` implícitos devem retornar o status de `ssh-keygen` e evitar que a unidade falhe, respectivamente.

Para melhores resultados e facilidade, aconselho criar um script externo para fazer todas as execuções condicionais em um só lugar.

informação relacionada