Процесс запуска как другой пользователь/группа (в init.d сценарии)

В духе предыдущих двух книжных рекомендаций я также рекомендовал бы

Интерфейс программирования LINUX M. Kerrisk

который, хотя предназначаясь для темы системного программирования UNIX/Linux, показывает тонны подробной информации о том, как Linux и в более общем плане системы UNIX работают с точки зрения программиста/пользователя. Это копается в мельчайших подробностях в большинстве маркеров, упомянутых в ответе vdboor, и показывает достаточно детали понятным и читаемым способом для получения ощущения / изображение фундаментальных понятий UNIX и их основ.

10
06.10.2011, 00:13
2 ответа

Самый простой путь состоит в том, чтобы использовать su (1) команда, это имеет опцию, которая позволяет Вам выполнять команду через оболочку пользователя, пример:

su foo -c ls

Это переключится на пользовательское нечто и выполнит команду ls. Если у пользователя, которого Вы хотите использовать, нет допустимой оболочки (т.е. это не находится в/etc/shells, как/bin/false или/sbin/nologin), необходимо будет также указать оболочку на командной строке. Пример с выводом:

# su nobody -s /bin/bash -c id
uid=99(nobody) gid=99(nobody) groups=99(nobody) context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
12
27.01.2020, 20:01
  • 1
    su, кажется, не нравится это, я даю ему много аргументов. Я добираюсь Usage: su [options] [LOGIN] и su: unrecognized option '--debug' –   06.10.2011, 01:37
  • 2
    Не точно работа. Когда я выполняю эту строку как корень, я получаю ошибку su www-data -c ${MONOSERVER} /applications=${WEBAPPS} /socket=unix:/path/monoserve.pid & если я su www-data установите весь Вар и работайте ${MONOSERVER} /applications=${WEBAPPS} /socket=unix:/path/monoserve.pid & это хорошо работает. Как, таким образом, я решаю это? –   06.10.2011, 01:58
  • 3
    @acidzombie24 su берет отдельный аргумент, который является командой оболочки. Необходимо записать su www-data -c '$MONOSERVER "/application=$WEBAPPS" "/socket=unix:/path/monoserve.pid"', и удостоверьтесь это MONOSERVER и WEBAPPS экспортируются родительской оболочкой. (Отметьте: не делать su … -c "$MONOSERVER …" поскольку это перестанет работать, если какая-либо из переменных будет содержать специальные символы оболочки.) И если у Вас есть выделенное средство запуска демона такой как start-stop-daemon, используйте его. –  Gilles 'SO- stop being evil' 06.10.2011, 02:36
  • 4
    Gilles: Хорошо, я не заменяю init.d сценарий этим, я? Я могу поместить все переменные в новый сценарий и запуск, что как он быть легким и я ничего не должен был бы изучать. Но что является настолько особенным о start-stop-daemon? Я оставлю комментарий, что –   06.10.2011, 02:45

Если start-stop-daemon доступно в Вашей системе, необходимо, вероятно, использовать ее и взглянуть на ее опции (особенно -u и -g в этом случае).

(Иначе Вы могли бы использовать комбинацию su и sg.)

Обновление: Вот пример, взятый от некоторых /etc/init.d/mpd сценарий (который использует start-stop-daemon):

  • Команда Start:

    echo "Starting Music Player Daemon"
    start-stop-daemon --start --quiet --background --exec /usr/bin/mpd \
        --pidfile /var/run/mpd.pid --make-pidfile \
        -- --no-daemon /etc/mpd.conf 2>/dev/null
    

    Все, что следует -- аргумент /usr/bin/mpd сама программа. (daemonization процедура заботится о start-stop-daemon сценарием так mpd попросился не заботиться об этом с --nodaemon.)

  • Команда Stop:

    echo "Stopping Music Player Daemon"
    start-stop-daemon --stop --exec /usr/bin/mpd --pidfile /var/run/mpd.pid
    

Если mpd не отбрасывал полномочия отдельно, нужно было бы добавить (например), -u mpd, -g mpd опции к start-stop-daemon команда.

4
27.01.2020, 20:01
  • 1
    ответа, я не заменяю init.d сценарий start-stop-daemon, является мной? разве не было бы легче использовать su и файл сценария? Если я заменяю init.d, как я устанавливаю его для выполнения при запуске? что я являюсь передающим к start-stop-daemon? - редактирование я гуглю примеры ATM, возможно, я, привычке нужен ответ, но я чувствую себя подобно его попытке быть сложным –   06.10.2011, 02:47
  • 2
    Никакая удача. Вот моя строка. Это все еще работает как корень. Я проверил страницы справочника, и я все еще не знаю, что сделать об этом. start-stop-daemon --start --quiet --background -u www-data -g www-data --exec ${MONOSERVER} --pidfile /path/monoserve.pid --make-pidfile -- /applications=${WEBAPPS} /socket=unix:/path/monoserve.pid –   06.10.2011, 04:39

Теги

Похожие вопросы