Uruchom proces jako inny użytkownik / grupa (w skrypcie init.d)

10

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?

Stéphane Gimenez
źródło

Odpowiedzi:

12

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
ckk
źródło
su wydaje się, że nie podoba mi się wiele argumentów. Dostaję Usage: su [options] [LOGIN]isu: unrecognized option '--debug'
To nie do końca działa. Kiedy wykonuję tę linię jako root, pojawia się błąd, su www-data -c ${MONOSERVER} /applications=${WEBAPPS} /socket=unix:/path/monoserve.pid &jeśli su www-dataustawię wszystkie zmienne i uruchomię ${MONOSERVER} /applications=${WEBAPPS} /socket=unix:/path/monoserve.pid &, działa poprawnie. Jak to rozwiązać?
2
@ acidzombie24 suprzyjmuje 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 MONOSERVERi WEBAPPSsą 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.
Gilles „SO- przestań być zły”
Gilles: Dobra, nie zastępuję skryptu init.d tym, co? Mogę umieścić wszystkie zmienne w nowym skrypcie i uruchomić to, ponieważ jest to łatwe i nie musiałbym się niczego uczyć. Ale co jest takiego specjalnego w demonie start-stop? Pozostawię komentarz do tej odpowiedzi
Czy lepiej jest używać su lub su -login? Czytam człowieka su, ale nie rozumiem tego konkretnego przypadku
Massimo
4

Jeśli start-stop-daemonjest dostępna w systemie powinieneś używać go i rzucić okiem na jego opcji (szczególnie -ui -gw tym przypadku).

(W przeciwnym razie możesz użyć kombinacji sui sg.)

Aktualizacja: Oto przykład zaczerpnięty z jakiegoś /etc/init.d/mpdskryptu (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/mpdprogramu. (Procedura demonizacji jest obsługiwana przez skrypt start-stop-demon, więc mpdjest 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 mpdnie spadał przywileje sama, należałoby dodać (na przykład) -u mpd, -g mpdopcje do start-stop-daemonpolecenia.

Stéphane Gimenez
źródło
Nie zastępuję skryptu init.d demonem start-stop-prawda? czy nie byłoby łatwiej używać su i pliku skryptu? Jeśli zastąpię plik init.d, jak go zainstalować, aby działał podczas uruchamiania? co przekazuję demonowi start-stop? - edytuj - przeglądam przykłady z bankomatu Być może nie będę potrzebować odpowiedzi, ale wydaje mi się, że będzie to złożona odpowiedź
2
Brak szczęścia. Oto moja linia. Nadal działa jako root. Sprawdziłem strony podręcznika i nadal nie wiem, co z tym zrobić. 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