如何在shutdown和reboot时执行openssl命令?

时间:2018-03-25 12:44:53

标签: bash systemd shutdown autorun power-off

我想加密文件并记录关机或重启的时间 这就是我的所作所为 1.编辑一个bash脚本文件,在shutdown或reboot时执行。

vim log.sh
key="123456"
openssl enc -des3 -a -salt -in $HOME/test -k ${key} -out $HOME/test.asc
date >>  /home/log.info

2.edit log.service

sudo vim /etc/systemd/system/log.service
[Unit]
Description=Run command at shutdown
Before=shutdown.target reboot.target

[Service]
Type=oneshot
RemainAfterExit=true
ExecStop=/bin/bash /home/log.sh


[Install]
WantedBy=multi-user.target

3.systemctl enable log.service
4.reboot

重启后我发现/home/log.info中有日期信息,表示date >> /home/log.info已执行,没有$HOME/test.asc,表示openssl enc -des3 -a -salt -in $HOME/test -k ${key} -out $HOME/test.asc未执行。
命令可以在终端中成功运行。

key="123456"
openssl enc -des3 -a -salt -in $HOME/test -k ${key} -out $HOME/test.asc

如何修复我的log.service文件/etc/systemd/system/log.service以在关机和重启时执行openssl命令?

2 个答案:

答案 0 :(得分:1)

问题是${HOME}没有扩展到您的期望。当我在我的系统上尝试时,它会扩展为空。因此${HOME}/test变为/test。您可以通过在log.sh中重定向openssl命令的错误输出来检查这一点:

openssl enc -des3 -a -salt -in $HOME/test -k ${key} -out $HOME/test.asc 2> /home/log.error

解决方案1:

log.sh

中使用绝对路径

解决方案2:

User=的服务部分添加log.service。在这种情况下,请确保用户有权写入要写入的不同位置。有关参考,请参阅systemd.exec

  

$ USER,$ LOGNAME,$ HOME,$ SHELL

     

用户名(两次),主目录和登录shell。为具有User = set的单元设置变量,其中包括用户systemd实例

答案 1 :(得分:0)

{p> Before=记录在man systemd.unit中。它不适用于此用例。还记录了WantedBy=RequiredBy=。后者听起来像这里所期望的那样,但是你的日志记录失败了,它可能会阻止关机。 WantedBy=如果失败则不会阻止关机。阅读他们两个,看看哪一个更适合你的情况。

我建议使用这样的文件结构:

```

[Unit]
Description=Run command at shutdown

[Service]
Type=oneshot
RemainAfterExit=true
ExecStop=/bin/bash /home/log.sh


[Install]
WantedBy=shutdown.target reboot.target

```

您的Install阻止了将服务设置为在启动时启动,这不是您想要的。当您使用systemctl enable log.service启用服务时,新语法会将服务设置为在关闭时处于活动状态。

我还没有使用systemd测试这种run-at-shutdown方法。让我们知道它是如何工作的!