Как часть потока, который устанавливает 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-обертки, в то время как он выполняется, я понимаю, что это было бы плохой практикой, таким образом, я стараюсь избегать этого.
Необходимо работать 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 для корня, необходимо.