Intereting Posts
Серверная сторона против рендеринга на стороне клиента Дисплей сервера Не удалось выделить запрошенные разделы при установке Scientific Linux Передача сохраняет сброс разрешений файловой системы на FreeBSD Как выполнить удаленный сценарий оболочки через SSH и получить запрос на пароли командами, которые требуют этого в этом скрипте? Использование sshfs замораживает все терминалы Восстановление или восстановление файлов из поврежденного раздела F2FS? переопределение параметров для конфигурации клиента openssh Создавать Zip для каждой вложенной папки, но содержащую только согласованные файлы Невозможно правильно установить тип раздела с помощью разделенного ping работает, но завиток не полный rootfs на большом жестком диске, установка или обновление программного обеспечения невозможно Почему команда «find | grep 'filename' 'намного медленнее, чем «найти« имя файла »? Фильтрация избыточных путей из списка путей Сценарий для получения данных из файла csv и выполнения связанных операций в базе данных Почему время «кражи» постепенно увеличивается?

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

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

Самое распространенное предложение в Интернете, похоже, должно сделать

su myuser -c "my_process args" 

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

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

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

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

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

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