如何在关机和重启时执行 openssl 命令?

How to execute openssl command at shutdown and reboot?

我想加密文件并在关机或重启时记录时间。
这就是我所做的。
1.edit 在关机或重启时执行的 bash 脚本文件。

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 启用 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 命令在关机和重启时执行?

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这个方法。让我们知道它是如何工作的!

问题是 ${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:

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

$USER, $LOGNAME, $HOME, $SHELL

User name (twice), home directory, and the login shell. The variables are set for the units that have User= set, which includes user systemd instances