Я редагую сценарій init.d. Сценарій init.d запускає скрипт утиліти, який потім запускає процес. З будь-якого сценарію bash, як би я змусив його запустити основний процес як конкретного користувача та групи?
Я редагую сценарій init.d. Сценарій init.d запускає скрипт утиліти, який потім запускає процес. З будь-якого сценарію bash, як би я змусив його запустити основний процес як конкретного користувача та групи?
Відповіді:
Найпростіший спосіб - використовувати команду su (1), вона має опцію, яка дозволяє запускати команду через оболонку користувача, наприклад:
su foo -c ls
Це переключиться на foo користувача та виконає команду ls. Якщо користувач, якого ви хочете використовувати, не має дійсної оболонки (тобто не знаходиться в / etc / shell, як / 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
su www-data -c ${MONOSERVER} /applications=${WEBAPPS} /socket=unix:/path/monoserve.pid &
якщо я su www-data
встановив усі VARS і запускаю, ${MONOSERVER} /applications=${WEBAPPS} /socket=unix:/path/monoserve.pid &
він працює добре. Як я вирішую це?
su
приймає єдиний аргумент, який є командною оболонкою. Вам потрібно написати su www-data -c '$MONOSERVER "/application=$WEBAPPS" "/socket=unix:/path/monoserve.pid"'
та переконатися, що це MONOSERVER
і WEBAPPS
експортується материнською оболонкою. (Примітка: цього не робити su … -c "$MONOSERVER …"
, якщо будь-яка зі змінних містить спеціальні символи оболонки.) А якщо у вас є виділений інструмент запуску демонів, наприкладstart-stop-daemon
, використовуйте його.
Якщо start-stop-daemon
він доступний у вашій системі, ви, ймовірно, повинні ним користуватися і ознайомитись з його параметрами (особливо -u
і -g
в цьому випадку).
(Інакше ви можете використовувати комбінацію su
та sg
.)
Оновлення: Ось приклад, взятий з деякого /etc/init.d/mpd
сценарію (який використовує start-stop-daemon
):
Команда запуску:
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
програми. (Процедура демонізації опікується сценарієм старт-стоп-демон, тому mpd
просять не турбуватися про це --nodaemon
.)
Команда зупинки:
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
команді.
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
Usage: su [options] [LOGIN]
таsu: unrecognized option '--debug'