Edytuję skrypt init.d. Skrypt init.d uruchamia skrypt narzędziowy, który następnie uruchamia proces. Z każdego skryptu bash, jak sprawić, by uruchomił główny proces jako określony użytkownik i grupa?
Edytuję skrypt init.d. Skrypt init.d uruchamia skrypt narzędziowy, który następnie uruchamia proces. Z każdego skryptu bash, jak sprawić, by uruchomił główny proces jako określony użytkownik i grupa?
Odpowiedzi:
Najprostszym sposobem jest użycie polecenia su (1), ma opcję, która pozwala na uruchomienie polecenia za pomocą powłoki użytkownika, na przykład:
su foo -c ls
Spowoduje to przełączenie na użytkownika foo i uruchomienie polecenia ls. Jeśli użytkownik, którego chcesz użyć, nie ma poprawnej powłoki (tzn. Nie ma jej w / etc / shells, takich jak / bin / false lub / sbin / nologin), będziesz musiał także określić powłokę w wierszu poleceń. Przykład z wyjściem:
# 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 &
jeśli su www-data
ustawię wszystkie zmienne i uruchomię ${MONOSERVER} /applications=${WEBAPPS} /socket=unix:/path/monoserve.pid &
, działa poprawnie. Jak to rozwiązać?
su
przyjmuje pojedynczy argument, który jest poleceniem powłoki. Musisz napisać su www-data -c '$MONOSERVER "/application=$WEBAPPS" "/socket=unix:/path/monoserve.pid"'
, i upewnij się, że MONOSERVER
i WEBAPPS
są eksportowane przez powłokę dominującego. (Uwaga: nie rób su … -c "$MONOSERVER …"
tego, ponieważ to się nie powiedzie, jeśli dowolna zmienna zawiera znaki specjalne powłoki.) A jeśli masz dedykowany program uruchamiający demony, taki jakstart-stop-daemon
, użyj go.
Jeśli start-stop-daemon
jest dostępna w systemie powinieneś używać go i rzucić okiem na jego opcji (szczególnie -u
i -g
w tym przypadku).
(W przeciwnym razie możesz użyć kombinacji su
i sg
.)
Aktualizacja: Oto przykład zaczerpnięty z jakiegoś /etc/init.d/mpd
skryptu (który używa start-stop-daemon
):
Uruchom polecenie:
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
Wszystko, co następuje, --
jest argumentem dla samego /usr/bin/mpd
programu. (Procedura demonizacji jest obsługiwana przez skrypt start-stop-demon, więc mpd
jest proszony, aby się tym nie przejmować --nodaemon
.)
Zatrzymaj polecenie:
echo "Stopping Music Player Daemon"
start-stop-daemon --stop --exec /usr/bin/mpd --pidfile /var/run/mpd.pid
Jeśli mpd
nie spadał przywileje sama, należałoby dodać (na przykład) -u mpd
, -g mpd
opcje do start-stop-daemon
polecenia.
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]
isu: unrecognized option '--debug'