Запустите скрипт на следующей перезагрузке и удалите сценарий

Как часть потока, который устанавливает Ubuntu 16.04 (с нуля к полностью настроенному, с большим количеством дополнительного установленного программного обеспечения и изменяется сделанный после установки), мне нужен способ запустить скрипты (которые загружаются во время установки) после следующей перезагрузки (и только следующая перезагрузка), и удалите сценарии и конец с другой перезагрузкой.

У меня уже есть сервис, который я использую для того, чтобы запустить скрипты после первой начальной загрузки, но не удаляя их (это может быть инициировано снова в более позднее время в случае необходимости), но я теперь нахожу, что я должен запустить скрипты, которые должны быть удалены впоследствии, поскольку они содержат уязвимую информацию.

systemd сервис, который я использую для других сценариев, похож на это:

[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 и/root/bin/firstrun-wrapper добавляются во время установки./etc/default/firstrun содержит пароль и удален сценарием firstrun-обертки, препятствуя тому, чтобы сервис запустился снова после перезагрузки. firstrun-обертка выполняет набор сценариев все добавленные во время установки и заканчивается с перезагрузкой.

Сервис может использоваться снова позже для выполнения той же установки (путем добавления/etc/default/firstrun файла)

Таким образом, мой вопрос. Как я могу запустить скрипт после следующей перезагрузки, удалив сценарий после того, как это выполнилось, и после удаления сценария, инициируйте перезагрузку?

Для меня не имеет значения, использует ли это systemd или нет, и хорошо с 'пустым' (пустое значение, содержащее соответствующую / уязвимую информацию) файл, оставляемый в системе после этого.

Моя начальная буква думала, должен был изменить мой текущий сервис. Я думал, что мог добавить другой сценарий в firstrun-обертке, которая удаляет определенные файлы и изменяет firstrun-обертку больше, чтобы не включать их и выполнить тот сценарий через ExecStopPost, но это не инициировано сервисом, заканчивающимся самостоятельно (от того, что я могу сказать). Даже если я могу изменить файл firstrun-обертки, в то время как он выполняется, я понимаю, что это было бы плохой практикой, таким образом, я стараюсь избегать этого.

1
задан 21 February 2018 в 13:08

1 ответ

Необходимо работать crontab -e для пользователя, который запустит скрипт - sudo crontab -e для корня или sudo -u user_name -e отредактировать crontab для user_name. Вставить @reboot /path/to/file (NB! Не забывайте пустую новую строку). Сам сценарий должен быть похожим на это:

#!/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

Для автоматизации этого процесса, можно использовать Ansible. Вот пример простого сборника пьес, я выполнил его на своем localhost:

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

Во-первых, необходимо выполнить сборник пьес, он обновляет задачи крона для root. После перезагружают сценарий, должен быть удален точно так же, как /var/spool/cron/crontabs/root запись файла со строкой @reboot. Вы свободны изменить файл для общего удаления crontab для корня, необходимо.

2
ответ дан 7 December 2019 в 13:26

Другие вопросы по тегам:

Похожие вопросы: