在下次重新啟動時運行腳本並刪除腳本

在下次重新啟動時運行腳本並刪除腳本

作為安裝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 -eforsudo -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"

首先,您需要執行 playbook,它會更新root.重新啟動後,應該刪除腳本,就像/var/spool/cron/crontabs/root檔案條目一樣@重啟細繩。您可以隨意修改該檔案以完全刪除 crontab,因為 root 是必要的。

相關內容