LINUX.ORG.RU

Автозапуск скрипта от root'а без ввода пароля

 , , , ,


0

1

Есть скрипт, который нужно запускать при каждом старте системы с правами root, но не докучать запросом пароля.

Перерыл уже кучу информации, но пока безрезультатно.

Что было сделано:

Сотворен файл /etc/systemd/system/mycommand.service содержания следующего:

[Unit]

Description=description

[Service]

ExecStart=/home/mapper720/script.sh

[Install]

WantedBy=multi-user.target

Далее, следуя советам из интернетов, отправляю в терминал sudo systemctl enable mycommand.service и получаю

Failed to enable unit: Unit file mycommand.service does not exist.

Помучав google duckduckgo ещё немного, натыкаюсь на это. Пробую повторить вышеприведённую команду (sudo systemctl enable...), указав уже полный путь к файлу mycommand.service. На этот раз никакой ошибки в терминале не высвечивается.

Дальше вбиваю - следуя советам на том же stackoverflow - sudo systemctl daemon-reload и перезагружаю ПК. При перезагрузке ничего не происходит.

Думал, может, скрипт вызывается слишком рано и что-то там прогрузиться не успевает? Добавил задержку (sleep 7s) - ничего не поменялось.

Что делать? ОС - Manjaro.

P.S. Если кто будет советовать смотреть логи - указывайте, КАКИЕ ИМЕННО логи и ЧТО именно в них смотреть. Опыта работы с логами нет совсем.

Чтоб системда увидела файл службы, надо сначала запустить daemon-reload, а уже потом можно start, enable итд.

указав уже полный путь к файлу

эм, не надо так. советую прежде чем пробовать остальные советы - запустить systemctl disable /полный/путь. Естественно после этого надо будет обратно заэнейблить, но уже без полного пути.

что смотреть

systemctl status myservice, journalctl -u myservice.

Ещё можно проверить корректность файла - systemd-analyze verify myservice.

Задержка в скрипте не нужна, правильнее будет в файле .service прописать, что ему нужно - всякие After=network.target или After=mnt-storage.mount. Если ему, конечно, вообще что-либо подобное нужно.

token_polyak ★★★★
()
Последнее исправление: token_polyak (всего исправлений: 4)
Ответ на: комментарий от token_polyak

Не помогло. systemctl status показывает следующее:


× myservice.service - DATA-EXPUNGED
     Loaded: loaded (/etc/systemd/system/myservice.service; enabled; preset: disabled)
     Active: failed (Result: exit-code) since Thu 2023-06-29 20:51:02 MSK; 1min 4s ago
   Duration: 956ms
    Process: 1050 ExecStart=/home/mapper720/script.sh (code=exited, status=203/EXEC)
   Main PID: 1050 (code=exited, status=203/EXEC)
        CPU: 726us

июн 29 20:51:01 Septem systemd[1]: Started DATA-EXPUNGED.
июн 29 20:51:02 Septem (mount.sh)[1050]: myservice.service: Failed to locate executable /home/mapper720/script.sh: No such file or directory
июн 29 20:51:02 Septem (mount.sh)[1050]: myservice.service: Failed at step EXEC spawning /home/mapper720/script.sh: No such file or directory
июн 29 20:51:02 Septem systemd[1]: myservice.service: Main process exited, code=exited, status=203/EXEC
июн 29 20:51:02 Septem systemd[1]: myservice.service: Failed with result 'exit-code'.

Файл /home/mapper720/script.sh, разумеется, существует. Команды find и cat не дадут соврать (пути копировались из этого лога).

journalctl -u выдаёт то же самое («No such file or directory»)

Mapper720
() автор топика
Последнее исправление: Mapper720 (всего исправлений: 1)
Ответ на: комментарий от Mapper720

А права на исполнение у данного файла есть? ls -l /home/mapper720/script.sh, буква x.

Если нет - можно либо chmod +x файл, либо поменять ExecStart=путь к скрипту на ExecStart=/bin/bash (или sh) путь к скрипту

token_polyak ★★★★
()
Последнее исправление: token_polyak (всего исправлений: 1)
Ответ на: комментарий от utanho

Скрипт содержит пароль, а если запихать его в /usr/bin, то его содержимое будет как на ладони (если загрузиться с LiveUSB, например). Домашний же каталог зашифрован, его извне не просмотришь.

Mapper720
() автор топика
Последнее исправление: Mapper720 (всего исправлений: 1)
Ответ на: комментарий от Mapper720

Вот в чем дело. Это и есть причина проблемы.

Естественно решение не в том, чтоб вообще ничего не шифровать. Просто надо прописать, чтоб скрипт запускался после монтирования домашнего каталога пользователя.

Если шифруется не весь раздел /home, а именно что домашний каталог - будет несколько сложнее, ибо разблокировка, вероятно, в моменте входа пользователя. Как прописать запуск системного сервиса (от рута) после входа определённого пользователя - я, к сожалению, не знаю.

Да и не покидает ощущение, что что-то деляешь не так (как и указал @utanho), и что идея шифровать не весь диск скопом, а что-то там по отдельности, вообще несколько ошибочна.

token_polyak ★★★★
()
Последнее исправление: token_polyak (всего исправлений: 3)
Ответ на: комментарий от token_polyak

Просто надо прописать, чтоб скрипт запускался после монтирования домашнего каталога пользователя.

В service-файле есть следующая строка:

[Unit]
Description=DATA-EXPUNGED
[b]RequiresMountsFor=/home/mapper720[/b]

Я так понимаю, она и нужна для запуска скрипта после монтирования ДК, разве нет?

Если шифруется не весь раздел /home, а именно что домашний каталог

Шифровался, как я понимаю, именно домашний каталог конкретного юзверя, командой ecryptfs-migrate-home -u mapper720.

Да и не покидает ощущение, что что-то деляешь не так (как и указал @utanho), и что идея шифровать не весь диск скопом, а что-то там по отдельности, вообще несколько ошибочна.

Что, например?

Жёсткий диск (на 2 тб) шифровать полностью нет никакого смысла. Шифрование требуется только для домашнего каталога.

Mapper720
() автор топика

Делайте, как этот чувак делал, через сервис пользователя, с учётом его вопроса и ответов (включая замечания по безопасности) – https://unix.stackexchange.com/questions/720423/systemd-user-service-with-root-permissions

После входа пользователя домашняя папка будет расшифрована и сервис запустится.

Сам скрипт в /usr/local/bin. А секреты через переменные окружения.

Если такой вариант подойдёт, конечно.

thegoldone
()
Ответ на: комментарий от Mapper720

Я так понимаю, она и нужна для запуска скрипта после монтирования ДК, разве нет?

Если /home/пользователь прописано в /etc/fstab, то наверное да.

Что, например?

Запуск чего-то, что не должно лежать открытым текстом, из зашифрованной домашней директории, из-под рута. Всё вместе.

Жёсткий диск (на 2 тб) шифровать полностью нет никакого смысла. Шифрование требуется только для домашнего каталога.

Тем не менее, FDE проще, надёжнее и безопастнее. LUKS-том - одно блочное устройство с файлсистемой, eCryptFS - несколько «подвижных частей», больше точек отказа (?).

token_polyak ★★★★
()
Последнее исправление: token_polyak (всего исправлений: 3)

В общем, заставить работать этот service-файл я так и не смог, поэтому пошёл по другому пути: в /etc/sudoers прописал запуск конкретного скрипта чрез sudo без запроса пароля. День второй, работает, как задумано…

Mapper720
() автор топика