Как выполнить команду 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. Дайте нам знать, как это работает!