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.service
inclui:
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'
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.