Я редактирую скрипт 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'