Какой рекомендуемый способ запуска службы от имени пользователя, не являющегося пользователем root?

Какой рекомендуемый способ запуска службы от имени пользователя, не являющегося пользователем root?

У меня есть простой скрипт init.d, который запускает и останавливает процесс. Я вызываю init.d как root, но я хотел бы, чтобы процесс, которым он управляет, запускался от имени определенного пользователя.

Наиболее распространенное предложение в Интернете, похоже, заключается в следующем:

su myuser -c "my_process args"

Однако это создает второе пространство процесса, новую оболочку и т. д. и несколько неэлегантно.

Я бы предпочел использовать exec(), так как он заменяет оболочку, но это не принимает пользователя в качестве аргумента. Это тот случай, когда мне следует использовать setuid()сначала? Что насчет установки gid? Есть ли какие-то подводные камни, о которых следует знать?

Или есть ли решения для конкретного дистрибутива, позволяющие запустить init.d от имени другого пользователя? Моя среда — Centos 6.4.

решение1

Зависит от дистрибутива, но дистрибутивы на основе RHEL используют функцию Bash, которую они берут из источника, /etc/rc.d/init.d/functionsкоторая называется , daemonкоторая сама по себе является просто оберткой вокруг runuserкоманды. Из того, что я могу сказать по исходным файлам, она функционально идентична suв большинстве случаев, просто она не проходит через PAM (вероятно, чтобы избежать некоторых проблем курицы и яйца в определенных случаях).

Это не совсем ответ на ваши возражения, но это то, как это делают сервисы. Чистота и общее соответствие логике, которые вы хотите, являются частью мотивации для таких вещей, какsystemd

решение2

Использование su someuser -c ...— это то, что нужно. Для начала setuid()— это системный вызов, недоступный для кода оболочки. Не усложняйте это больше, чем нужно.

Связанный контент