如何在关机和重启时执行 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
我想加密文件并在关机或重启时记录时间。
这就是我所做的。
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 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