Я редактирую скрипт init.d. Сценарий init.d запускает служебный скрипт, который затем запускает процесс. Из любого сценария bash, как я могу заставить его запускать основной процесс как определенный пользователь и группа?
Я редактирую скрипт init.d. Сценарий init.d запускает служебный скрипт, который затем запускает процесс. Из любого сценария bash, как я могу заставить его запускать основной процесс как определенный пользователь и группа?
Ответы:
Самый простой способ - использовать команду su (1), у нее есть опция, позволяющая запустить команду через пользовательскую оболочку, например:
su foo -c ls
Это переключится на пользователя foo и запустит команду 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
su www-data -c ${MONOSERVER} /applications=${WEBAPPS} /socket=unix:/path/monoserve.pid &если я su www-dataустановил все переменные и запустил ${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программы. (Процедура демонизации выполняется скриптом start-stop-daemon, поэтому 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'