Ejecute el script en el próximo reinicio y elimine el script

Ejecute el script en el próximo reinicio y elimine el script

Como parte de un flujo que instala Ubuntu 16.04 (desde cero hasta completamente configurado, con una gran cantidad de software adicional instalado y cambios posteriores a la instalación), necesito una forma de ejecutar scripts (que se descargan durante la instalación) después del próximo reinicio (y solo el siguiente reinicio) y elimine los scripts y finalice con otro reinicio.

Ya tengo un servicio que uso para ejecutar scripts después del primer arranque, pero sin eliminarlos (esto se puede activar nuevamente más adelante si es necesario), pero ahora encuentro que necesito ejecutar scripts que deben eliminarse después, como contienen información sensible.

El servicio systemd que estoy usando para los otros scripts tiene este aspecto:

[Unit]
Description=First run specifics
After=network-online.target
Requires=network-online.target

[Service]
Type=simple
EnvironmentFile=/etc/default/firstrun
ExecStart=/root/bin/firstrun-wrapper "${PASSWORD}"

[Install]
WantedBy=multi-user.target

/etc/default/firstrun y /root/bin/firstrun-wrapper se agregan durante la instalación. /etc/default/firstrun contiene una contraseña y el script firstrun-wrapper lo elimina, lo que impide que el servicio se inicie nuevamente después de reiniciar. firstrun-wrapper ejecuta un montón de scripts agregados durante la instalación y finaliza con un reinicio.

El servicio se puede utilizar nuevamente más tarde para ejecutar la misma configuración (agregando el archivo /etc/default/firstrun)

Entonces mi pregunta es.¿Cómo puedo ejecutar un script después del siguiente reinicio, eliminar el script después de que se haya ejecutado y, después de eliminarlo, activar un reinicio?

No me importa si esto usa systemd o no, y estoy de acuerdo con que se deje un archivo 'vacío' (es decir, vacío que no contiene información relevante/sensible) en el sistema después de esto.

Mi pensamiento inicial fue modificar mi servicio actual. Pensé que podría agregar otro script en firstrun-wrapper que elimine ciertos archivos y modifique firstrun-wrapper para que no los incluya más, y ejecutar ese script a través de ExecStopPost, pero eso no se activa cuando el servicio finaliza por sí solo (por lo que sé). Puedo decir). Incluso si puedo modificar el archivo firstrun-wrapper mientras se ejecuta, entiendo que sería una mala práctica, así que estoy tratando de evitarlo.

Respuesta1

Debe ejecutar crontab -epara el usuario que ejecutará el script, sudo crontab -epararaízo sudo -u user_name -epara editar crontab paranombre de usuario. Insertar @reboot /path/to/file(¡NB! No olvides la nueva línea vacía). El script en sí debería verse así:

#!/bin/bash
do_your_stuff
# remove from root specific crontab setting all the information about the script
sed -i '/@reboot \/path\/to\/file/d' /var/spool/cron/crontabs/root
# remove the script file itself
rm -- "$0"
# reboot the machine in 2 minutes
shutdown -r +2

Para automatizar este proceso puedes utilizar Ansible. Aquí hay un ejemplo de un libro de jugadas simple, lo ejecuté en mi servidor local:

---
- hosts: localhost
  tasks:
  - name: cron job
    cron:
      name: "a job for reboot"
      special_time: reboot
      job: "/path/to/file"

Primero, debe ejecutar el libro de jugadas, este actualiza las tareas cron para root. Después de reiniciar, el script debe eliminarse al igual que la /var/spool/cron/crontabs/rootentrada del archivo con@reiniciarcadena. Eres libre de modificar el archivo para eliminar totalmente crontab para root si es necesario.

información relacionada