Настройка службы Systemd для работы с правами root

21

У меня есть сервис в виде приложения node.js, настроенного с помощью Systemd на Raspbian Jessie, и он использует свою собственную учетную запись пользователя. Тем не менее, я обнаружил, что служба работает неправильно, потому что у нее нет необходимых разрешений. Один из установленных мной узловых модулей требует root-доступа. Если я запускаю приложение вручную с помощью sudo, все работает нормально.

Есть ли способ сообщить systemd запустить службу с помощью sudo?

Люк
источник
2
Как выглядит ваш файл модуля, добавьте его в свой вопрос? Обычно systemdзапускает файлы модулей с правами root.
Томас,

Ответы:

31

скажите systemd запустить сервис с sudo?

sudo не имеет к этому никакого отношения.

Обычно вы указываете systemd запускать службу в качестве определенного пользователя / группы с помощью директивы User=and Group=в [Service]разделе файла модуля.

Установите их как root (или удалите их, так как запуск от имени root используется по умолчанию).

HBruijn
источник
Я настроил его на использование определенного пользователя, поскольку я использовал руководство по его настройке. Однако в моем случае это было неуместно. Я удалил это для запуска от имени пользователя по умолчанию и теперь все работает!
Люк
2
Запуск от имени root не совсем то же самое, что запуск с User=root. Смотри мой ответ.
Марк Стосберг
Где можно отредактировать этот файл?
Матфея
15

Чтобы очистить, systemdсистемные службы по умолчанию запускаются от имени пользователя root, но между поведением по умолчанию и использованием системной службы все еще существует разница User=root.

Как описано в переменных среды в порожденных процессах , эти переменные устанавливаются только в том случае, если User=установлено:

$USER, $LOGNAME, $HOME, $SHELL

Я проверил, чтобы подтвердить этот вывод. Поэтому, если вы хотите запустить службу systemd от имени пользователя root, которому требуется одна из перечисленных выше переменных, вам необходимо установить User=root.

Марк Стосберг
источник
Спасибо! Это было единственное, что сработало для меня в приложении, которое у меня есть
Педро Торрес
Примечание: если вы установили User = root, вы, вероятно, также должны установить Group = root :) superuser.com/a/1452367/39364
rogerdpack
2

временное решение, но заставило его работать в крайнем случае:

/usr/bin/sudo /bin/bash -lc 'bundle exec rails server -e demo -p 80'

Может работать с пользователем, имеющим права sudo в системном файле systemd, например:

[Unit]
Description=Rails Webserver
After=syslog.target

[Service]
Type=simple
User=ubuntu
WorkingDirectory=/var/www/webserver
ExecStart=/usr/bin/sudo /bin/bash -lc 'bundle exec rails server -e demo -p 80'
Restart=always
KillSignal=SIGQUIT

[Install]
WantedBy=multi-user.target
daino3
источник
Это имеет несколько проблем: во-первых, первые два ответа объясняют, почему не нужно использовать пользователя, а затем sudo, и показывают правильный способ сделать это. Во-вторых, вы все равно не должны запускать ваше веб-приложение как root. В-третьих, ваше веб-приложение должно находиться за обычным веб-сервером, таким как nginx.
Майкл Хэмптон
Я не буду не согласен с вами по любому из ваших пунктов. Но если кто-то, как и я, хотел бы простую, быструю, как вы, поддержку сервера, это жизнеспособный вариант, который работает.
daino3
Почти так быстро, как вы можете. Очевидно, что использование sudoнемного замедлит запуск. И это не нужно.
Майкл Хэмптон
@MichaelHampton Я пытаюсь написать бэкдор, поэтому я нашел этот ответ полезным!
П. Соуцикевич
1

Запустите его как системный пользователь, в этом случае по умолчанию служба работает от имени пользователя root.

Умут
источник