İşlemi başka bir kullanıcı / grup olarak başlatma (init.d komut dosyasında)


10

Bir init.d betiğini düzenliyorum. İnit.d komut dosyası, daha sonra bir işlemi çalıştıran bir yardımcı program komut dosyası çalıştırır. Her iki bash komut dosyasından, ana işlemi belirli bir kullanıcı ve grup olarak başlatmasını nasıl sağlarım?

Yanıtlar:


12

En basit yol su (1) komutunu kullanmaktır, kullanıcının kabuğu üzerinden bir komut çalıştırmanıza izin veren bir seçeneğe sahiptir, örneğin:

su foo -c ls

Bu kullanıcı foo'ya geçer ve ls komutunu çalıştırır. Kullanmak istediğiniz kullanıcının geçerli bir kabuğu yoksa (yani / bin / false veya / sbin / nologin gibi / etc / shell'lerde değil) komut satırında da bir kabuk belirtmeniz gerekir. Çıktı ile örnek:

# 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 ben pek çok argüman vermek gibi görünmüyor. Ben alıyorum Usage: su [options] [LOGIN]vesu: unrecognized option '--debug'

Tam olarak çalışmıyor. İ root olarak bu satırı yürütmek zaman ben bir hata alıyorum su www-data -c ${MONOSERVER} /applications=${WEBAPPS} /socket=unix:/path/monoserve.pid &ben eğer su www-datatüm vars ve çalıştırmak set ${MONOSERVER} /applications=${WEBAPPS} /socket=unix:/path/monoserve.pid &o cezayı çalışır. Bunu nasıl çözerim?

2
@ acidzombie24 subir kabuk komutu olan tek bir argüman alır. Yazmanız su www-data -c '$MONOSERVER "/application=$WEBAPPS" "/socket=unix:/path/monoserve.pid"'ve bunun MONOSERVERve WEBAPPSana kabuk tarafından dışa aktarıldığından emin olmanız gerekir . (Not: su … -c "$MONOSERVER …"değişkenlerden herhangi biri kabuk özel karakterleri içeriyorsa bu başarısız olur.) Ve böylestart-stop-daemon özel bir arka plan başlatıcısı varsa bunu kullanın.
Gilles 'SO- kötülüğü bırak'

Gilles: Pekala, init.d betiğini bununla değiştirmiyorum? Tüm değişkenleri yeni bir senaryoya koyabilir ve kolay olduğu için bir şey öğrenmek zorunda kalmayacağım. Ama start-stop-daemon hakkında bu kadar özel olan ne? Bu yanıta bir yorum bırakacağım

Su veya su -login kullanmak daha mı iyi? Su adamını okudum ama bu özel durum için anlayamıyorum
Massimo

4

Eğer start-stop-daemonsisteminizde geçerli muhtemelen kullanmak ve seçenekleri (özellikle de bakabilirsiniz olmalıdır -uve -gbu durumda).

(Aksi takdirde, suve öğelerinin birleşimini kullanabilirsiniz sg.)

Güncelleme: İşte bazı /etc/init.d/mpdkomut dosyalarından alınan bir örnek (kullanan start-stop-daemon):

  • Başlat komutu:

    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
    

    Takip eden her şey programın kendisi --için bir argüman /usr/bin/mpd. (Daemonization prosedürü start-stop-daemon betiği tarafından halledilir, bu yüzden mpdonunla ilgilenmemesi istenir --nodaemon.)

  • Durdurma komutu:

    echo "Stopping Music Player Daemon"
    start-stop-daemon --stop --exec /usr/bin/mpd --pidfile /var/run/mpd.pid
    

Eğer mpdtek başına ayrıcalıkları bırakarak değildi, bir (örneğin) eklemek gerekir -u mpd, -g mpdseçenekler start-stop-daemonkomuta.


Ben init.d betiği start-stop-daemon ile değiştirmiyorum? su ve komut dosyası kullanmak daha kolay olmaz mıydı? İnit.d'i değiştirirsem başlangıçta çalıştırmak için nasıl kurabilirim? start-stop-daemon'a ne geçiyorum? -edit- i googling örnekler ATM belki bir cevap gerekmeyecek ama karmaşık bir cevap olacak gibi hissediyorum

2
Şanssız. İşte benim çizgim. Hala kök olarak çalışıyor. Adam sayfalarını kontrol ettim ve hala bu konuda ne yapacağımı bilmiyorum. 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
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.