Как выполнить команду openssl при выключении и перезагрузке?

Я хочу зашифровать файл и записать время при выключении или перезагрузке.
Вот что я делаю.
1. Отредактируйте файл 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. редактировать лог.сервис

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 выполненной при выключении и перезагрузке?

2 ответа

Решение

Проблема в том, что ${HOME} не расширяется до того, что вы ожидаете. Когда я пробую это в моей системе, это расширяется до нуля. Так ${HOME}/test становится /test, Вы можете проверить это, перенаправив вывод ошибок для вашей команды openssl в log.sh:

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

Имя пользователя (дважды), домашний каталог и оболочка входа. Переменные устанавливаются для модулей, для которых установлен User= set, включая пользовательские экземпляры systemd.

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. Дайте нам знать, как это работает!

Другие вопросы по тегам