¿Cómo ejecutar condicionalmente dos comandos ExecStart diferentes en un archivo de unidad systemd?

¿Cómo ejecutar condicionalmente dos comandos ExecStart diferentes en un archivo de unidad systemd?

Yo quieroejecutar condicionalmente cualquiera de(o ambos) estos comandos en unsolteroarchivo de unidad systemd:

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

El primero se ejecutaría en estas condiciones:

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

El segundo se ejecutaría en estas condiciones:

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

Podrían faltar ambas claves, o solo una, o ninguna. Obviamente, si existe una clave, no quiero regenerarla. Mi pregunta es con respecto a las claves ssh, pero los conceptos deberían ser aplicables a cualquier archivo de unidad systemd. Si hay una forma genérica de hacer esto en archivos unitarios, debería funcionar aquí (supongo).

El trasfondo es:

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

Wants=sshdgenkeys.service

Los contenidos estándar de /usr/lib/systemd/system/sshdgenkeys.serviceson:

[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

Mi problema con ese archivo unitario escuando falta algún tipo de clave, todas se vuelven a generar. Planeo eliminar las claves dsa y ecdsa. Por lo tanto, solo necesito verificar dos tipos de claves y solo quiero regenerar las claves específicas que faltan, si las hay.

Por favor recomiende cómo se puede lograr esto. Tengo una pregunta relacionada pero diferente aquí:¿Cómo eliminar (no anular, no crear nuevas) opciones de los archivos de unidad systemd?. Estas dos preguntas son independientes e involucran diferentes aspectos del trabajo con archivos unitarios. Esta pregunta trata sobre la ejecución condicional de diferentes comandos, la otra pregunta trata sobre la eliminación de opciones estándar de los archivos unitarios.

Respuesta1

Las condiciones sólo se aplican a toda la unidad, no a las especificaciones de trabajo individuales dentro de ella.

Entonces, para ejecutar condicionalmente algunos de los trabajos, esas especificaciones del trabajo deben verificarse por sí mismas antes de realizar la acción final.

fe. como esto:(No probado, solo escrito en línea)

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. `$$` es para evitar que systemd interprete el `$` mismo.\ De la sección "Líneas de comando" de `man systemd.service`:
Para pasar un signo de dólar literal, utilice "$$".
2. Los comandos implícitos "exit" son para devolver el estado de "ssh-keygen" y evitar que la unidad falle, respectivamente.

Para obtener mejores resultados y facilidad, recomendaría crear un script externo para realizar todas las ejecuciones condicionales en un solo lugar.

información relacionada