下次重启时运行脚本并删除脚本

下次重启时运行脚本并删除脚本

作为安装 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-wrapper 脚本删除,从而阻止服务在重启后重新启动。firstrun-wrapper 执行了安装期间添加的一组脚本,并重新启动完成。

该服务稍后可以再次使用来运行相同的设置(通过添加 /etc/default/firstrun 文件)

我的问题是。如何在下次重启后运行脚本,在脚本执行后删除脚本,并在删除脚本后触发重启?

这是否使用 systemd 对我来说并不重要,我可以接受此后系统上留下一个“空”文件(空的意思是没有包含任何相关/敏感信息)。

我最初的想法是修改我当前的服务。我认为我可以在 firstrun-wrapper 中添加另一个脚本,删除某些文件并修改 firstrun-wrapper 以不再包含它们,并通过 ExecStopPost 执行该脚本,但这不是由服务自行完成触发的(据我所知)。即使我可以在执行 firstrun-wrapper 文件时修改它,我也知道这不是一个好习惯,所以我试图避免这种情况。

答案1

您需要为将运行该脚本的crontab -e用户运行 -sudo crontab -e或者sudo -u user_name -e编辑 crontab用户名. 插入@reboot /path/to/file(注意!不要忘记空的新行)。脚本本身应如下所示:

#!/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。这是一个简单的剧本示例,我在本地主机上运行了它:

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

首先,你需要运行剧本,它会更新 cron 任务root。重启后,脚本应该被删除,就像/var/spool/cron/crontabs/root文件条目一样@重启字符串。您可以自由修改该文件以完全删除 root 的 crontab。

相关内容