Execute o script na próxima reinicialização e remova o script

1

Como parte de um fluxo que instala o Ubuntu 16.04 (do zero para totalmente configurado, com um monte de software extra instalado e alterações feitas após a instalação), eu preciso de uma maneira de executar scripts (que são baixados durante a instalação) após a próxima reinicialize (e somente a próxima reinicialização) e remova os scripts e termine com outra reinicialização.

Já tenho um serviço que uso para executar scripts após a primeira inicialização, mas sem excluí-los (isso pode ser acionado novamente mais tarde, se necessário), mas agora descubro que preciso executar scripts que devem ser excluídos depois, como eles contêm informações sensíveis.

O serviço systemd que estou usando para os outros scripts é assim:

[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 e / root / bin / firstrun-wrapper são adicionados durante a instalação. O / etc / default / firstrun contém uma senha e é excluído pelo script firstrun-wrapper, impedindo que o serviço seja iniciado novamente após a reinicialização. O firstrun-wrapper executa vários scripts adicionados durante a instalação e termina com uma reinicialização.

O serviço pode ser usado novamente mais tarde para executar a mesma configuração (adicionando o arquivo / etc / default / firstrun)

Então minha pergunta é. Como posso executar um script após a próxima reinicialização, removendo o script depois que ele foi executado e, depois de remover o script, acionar uma reinicialização?

Não importa para mim se isso usa systemd ou não, e estou bem com um arquivo 'vazio' (significado vazio que não contém informações relevantes / sensíveis) sendo deixado no sistema depois disso.

Meu pensamento inicial foi modificar meu serviço atual. Eu pensei que poderia adicionar outro script no wrapper firstrun que remove certos arquivos e modifica o firstrun-wrapper para não incluí-los mais, e executar esse script através do ExecStopPost, mas isso não é acionado pelo serviço que termina sozinho (pelo que eu pode dizer). Mesmo que eu possa modificar o arquivo wrapper-firper enquanto ele está sendo executado, eu entendo que isso seria uma má prática, então estou tentando evitar isso.

    
por Tobias 21.02.2018 / 09:04

1 resposta

2

Você precisa executar crontab -e para o usuário que executará o script - sudo crontab -e para raiz ou sudo -u user_name -e para editar o crontab para user_name . Insira @reboot /path/to/file (NB! Não esqueça a nova linha vazia). O script em si deve ficar assim:

#!/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 esse processo, você pode usar o Ansible. Aqui está um exemplo de um playbook simples, eu corri no meu localhost:

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

Primeiro, você precisa executar o manual, ele atualiza as tarefas do cron para root . Após a reinicialização, o script deve ser excluído da mesma forma que a entrada de arquivo /var/spool/cron/crontabs/root com a sequência @reboot . Você está livre para modificar o arquivo para excluir totalmente o crontab para root.

    
por M. Dm. 21.02.2018 / 11:00