Я создал несколько системных сервисов, которые в основном работают:
расположение:
/etc/systemd/system/multi-user.target.wants/publicapi.service
содержание:
[Unit]
Description=public api startup script
[Service]
Type=oneshot
RemainAfterExit=yes
EnvironmentFile=-/etc/environment
WorkingDirectory=/home/techops
ExecStart=/home/techops/publicapi start
ExecStop=/home/techops/publicapi stop
[Install]
WantedBy=multi-user.target
Когда я пытаюсь перезапустить службу как пользователь techops в командной строке, я получаю следующий вывод:
==== AUTHENTICATING FOR org.freedesktop.systemd1.manage-units ===
Authentication is required to start 'publicapi.service'.
Multiple identities can be used for authentication:
1. Myself,,, (defaultuser)
2. ,,, (techops)
Choose identity to authenticate as (1-2):
Я хочу, чтобы только techops мог перезапустить службы, и я хочу, чтобы это приглашение не отображалось при входе в систему как techops. Как я могу это сделать?
Я читал, что есть разные подходы с polkit-1 или sudoers, но я не уверен.
[ОБНОВЛЕНИЕ] 2019-01-27 16:40
Спасибо за этот исчерпывающий ответ Томасу и Перлдуку. Это помогло мне улучшить мои знания о systemd.
В соответствии с подходом, чтобы запустить службу без запроса пароля, и я хочу извиниться, что я не подчеркнул достаточную реальную проблему:
На самом деле, самое важное для меня - то, что никто другой, кроме techops, не должен останавливать или запускать службу. Но по крайней мере с первыми двумя подходами я все еще могу работать, service publicapi stop
и я получаю подсказку ==== AUTHENTICATING FOR org.freedesktop.systemd1.manage-units ===
снова. Когда я выбираю пользователя по умолчанию и знаю пароль, я могу остановить все службы. Я хочу отказать этому пользователю в этом, даже если у него есть пароль . Важная справочная информация, чтобы лучше понять, почему это важнее для меня: пользователь по
умолчанию является единственным пользователем, который имеет доступ к ssh, но этот пользователь не может делать ничего другого (кроме перехода на других пользователей, если у вас есть пароль этих других пользователей) , Но на данный момент он может запускать или останавливать сервисы, но этот пользователь не должен этого делать.
Если кто-то получит пароль от defaultuser и войдет в систему через ssh, он может остановить все службы в данный момент. Это то, что я имел в виду, «я хочу, чтобы только techops мог перезапустить сервисы». Извините, что я не был так точен в моем начальном вопросе. Я думал, что sudoing пользователь techops может обойти эту проблему, но это не так. Сама проблема не в том, чтобы запустить команду без запроса пароля. (Я мог бы легко сделать это как пользователь techops, когда я просто выполняю /home/techops/publicapi start
). Сама проблема заключается в блокировке пользователя по умолчанию от запуска этих служб.
И я надеялся, что любое из решений может сделать это.
Я начал с подходов Томаса. Подход с sudo работает, когда я не хочу, чтобы у меня запрашивали пароль для пользователя, когда я выполняю команды, как описано, например,
sudo systemctl start publicapi.service
sudo systemctl stop publicapi.service
Второй подход у меня пока не работает. Я не могу запустить службу без запроса пароля, ==== AUTHENTICATING FOR org.freedesktop.systemd1.manage-units ===
и я могу войти в систему как defaultuser, когда у меня есть пароль этого пользователя.
При третьем подходе сервис даже не запускается при загрузке, поэтому я не уверен, что этот подход мне подходит. Я даже не могу это сделать, systemctl enable publicapi.service
что приводит меня к следующей ошибке:
Failed to enable unit: Unit file mycuisine-publicapi.service does not exist.
Ошибка не возникает, когда я перемещаю все службы обратно в / etc / systemd / system / и выполняю systemctl enable publicapi.service
. Затем служба запускается снова при загрузке.
Все эти подходы более или менее помогут обойти запрос пароля для пользователя techops, но когда я запускаю service publicapi stop
или systemctl stop publicapi
с defaultuser, я могу остановить службы, если у меня есть пароль. Но моя цель - заблокировать defaultuser от запуска или остановки служб вообще.
/etc/sudoers
файл, если есть ссылка для этого пользователя.
systemctl --user ...
от имени пользователя,techops
а не от имени пользователя root. Ни мое предложение, ни предложение @PerlDuck не дают никакихsudo
прав вашему defaultuser, но только пользователю techops .