
У меня есть простой скрипт 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()
— это системный вызов, недоступный для кода оболочки. Не усложняйте это больше, чем нужно.