Я редагую сценарій 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'