Luncurkan proses sebagai pengguna / grup lain (dalam skrip init.d)

10

Saya sedang mengedit skrip init.d. Skrip init.d menjalankan skrip utilitas yang kemudian menjalankan proses. Dari kedua skrip bash, bagaimana saya membuatnya meluncurkan proses utama sebagai pengguna dan grup tertentu?

Stéphane Gimenez
sumber

Jawaban:

12

Cara paling sederhana adalah dengan menggunakan perintah su (1), ia memiliki opsi yang memungkinkan Anda untuk menjalankan perintah melalui shell pengguna, contoh:

su foo -c ls

Ini akan beralih ke foo pengguna dan menjalankan perintah ls. Jika pengguna yang ingin Anda gunakan tidak memiliki shell yang valid (yaitu tidak ada di / etc / shells, seperti / bin / false atau / sbin / nologin) Anda juga harus menentukan shell di baris perintah. Contoh dengan output:

# 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
sumber
su sepertinya tidak suka saya memberikan banyak argumen. Saya mendapatkan Usage: su [options] [LOGIN]dansu: unrecognized option '--debug'
Ini tidak bekerja. Ketika saya menjalankan baris ini sebagai root saya mendapatkan kesalahan su www-data -c ${MONOSERVER} /applications=${WEBAPPS} /socket=unix:/path/monoserve.pid &jika saya su www-datamengatur semua vars dan menjalankannya ${MONOSERVER} /applications=${WEBAPPS} /socket=unix:/path/monoserve.pid &berfungsi dengan baik. Bagaimana saya mengatasi ini?
2
@ acidzombie24 sumengambil argumen tunggal, yang merupakan perintah shell. Anda perlu menulis su www-data -c '$MONOSERVER "/application=$WEBAPPS" "/socket=unix:/path/monoserve.pid"', dan memastikan bahwa MONOSERVERdan WEBAPPSdiekspor oleh shell induk. (Catatan: jangan lakukan su … -c "$MONOSERVER …"karena ini akan gagal jika salah satu variabel berisi karakter khusus shell.) Dan jika Anda memiliki peluncur daemon khusus sepertistart-stop-daemon , gunakan.
Gilles 'SO- stop being evil'
Gilles: Baiklah, saya tidak mengganti skrip init.d dengan itu saya? Saya dapat meletakkan semua variabel ke dalam skrip baru dan meluncurkannya karena mudah dan saya tidak perlu belajar apa pun. Tapi apa yang istimewa dari start-stop-daemon? Saya akan meninggalkan komentar pada jawaban itu
Apakah lebih baik menggunakan su atau su -login? Saya membaca su su tetapi saya tidak bisa mengerti untuk kasus khusus ini
Massimo
4

Jika start-stop-daemontersedia di sistem Anda, Anda mungkin harus menggunakannya dan melihat pilihannya (terutama -udan -gdalam hal ini).

(Jika tidak, Anda dapat menggunakan kombinasi dari sudan sg.)

Pembaruan: Berikut adalah contoh yang diambil dari beberapa /etc/init.d/mpdskrip (yang menggunakan start-stop-daemon):

  • Mulai perintah:

    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
    

    Segala sesuatu yang mengikuti --adalah argumen untuk /usr/bin/mpdprogram itu sendiri. (Prosedur daemonisasi ditangani oleh skrip start-stop-daemon sehingga mpddiminta untuk tidak mempedulikannya --nodaemon.)

  • Hentikan perintah:

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

Jika mpdtidak menjatuhkan hak istimewa dengan sendirinya, orang perlu menambahkan (misalnya) -u mpd, -g mpdopsi ke start-stop-daemonperintah.

Stéphane Gimenez
sumber
Saya tidak mengganti skrip init.d dengan start-stop-daemon bukan? Bukankah lebih mudah menggunakan su dan file skrip? Jika saya mengganti init.d bagaimana cara menginstalnya untuk dijalankan saat startup? apa yang saya lewati untuk memulai-berhenti-daemon? -edit- Saya contoh Google ATM mungkin saya tidak perlu jawaban tetapi saya merasa seperti itu akan menjadi jawaban yang kompleks
2
Tidak berhasil Ini baris saya. Itu masih berjalan sebagai root. Saya memeriksa halaman manual dan saya masih tidak tahu harus berbuat apa tentang ini. 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