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

10

Я редактирую скрипт init.d. Сценарий init.d запускает служебный скрипт, который затем запускает процесс. Из любого сценария bash, как я могу заставить его запускать основной процесс как определенный пользователь и группа?

Стефан Хименес
источник

Ответы:

12

Самый простой способ - использовать команду 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
ЦКК
источник
Су, похоже, не нравится, я приводил много аргументов. Я получаю Usage: su [options] [LOGIN]иsu: unrecognized option '--debug'
Это не совсем работает. Когда я выполняю эту строку от имени пользователя root, я получаю сообщение об ошибке, su www-data -c ${MONOSERVER} /applications=${WEBAPPS} /socket=unix:/path/monoserve.pid &если я su www-dataустановил все переменные и запустил ${MONOSERVER} /applications=${WEBAPPS} /socket=unix:/path/monoserve.pid &их. Как мне это решить?
2
@ acidzombie24 suпринимает один аргумент - команду оболочки. Вам нужно написать su www-data -c '$MONOSERVER "/application=$WEBAPPS" "/socket=unix:/path/monoserve.pid"'и убедиться, что MONOSERVERи WEBAPPSэкспортируются родительской оболочкой. (Примечание: не делайте, так su … -c "$MONOSERVER …"как это не удастся, если какая-либо из переменных содержит специальные символы оболочки.) И если у вас есть выделенная программа запуска демона, напримерstart-stop-daemon , используйте ее.
Жиль "ТАК - перестань быть злым"
Жиль: Хорошо, я не заменяю сценарий init.d этим, я? Я могу поместить все переменные в новый скрипт и запустить его как можно проще, и мне не нужно будет ничего изучать. Но что такого особенного в start-stop-daemon? Я оставлю комментарий к этому ответу
Лучше использовать su или su -login? Я читал человека Су, но я не могу понять для этого конкретного случая
Массимо
4

Если 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команде.

Стефан Хименес
источник
Я не заменяю скрипт init.d на start-stop-daemon? не проще ли использовать su и файл скрипта? Если я заменю init.d, как мне установить его для запуска при запуске? что я передаю start-stop-daemon? -Edit- я гуглю примеры ATM, возможно, мне не понадобится ответ, но я чувствую, что это будет сложный ответ
2
Неудачно. Вот моя линия. Он по-прежнему работает от имени пользователя root. Я проверил страницы справочника и до сих пор не знаю, что с этим делать. 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