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?
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?
Jawaban:
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
su www-data -c ${MONOSERVER} /applications=${WEBAPPS} /socket=unix:/path/monoserve.pid &
jika saya su www-data
mengatur semua vars dan menjalankannya ${MONOSERVER} /applications=${WEBAPPS} /socket=unix:/path/monoserve.pid &
berfungsi dengan baik. Bagaimana saya mengatasi ini?
su
mengambil argumen tunggal, yang merupakan perintah shell. Anda perlu menulis su www-data -c '$MONOSERVER "/application=$WEBAPPS" "/socket=unix:/path/monoserve.pid"'
, dan memastikan bahwa MONOSERVER
dan WEBAPPS
diekspor 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.
Jika start-stop-daemon
tersedia di sistem Anda, Anda mungkin harus menggunakannya dan melihat pilihannya (terutama -u
dan -g
dalam hal ini).
(Jika tidak, Anda dapat menggunakan kombinasi dari su
dan sg
.)
Pembaruan: Berikut adalah contoh yang diambil dari beberapa /etc/init.d/mpd
skrip (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/mpd
program itu sendiri. (Prosedur daemonisasi ditangani oleh skrip start-stop-daemon sehingga mpd
diminta 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 mpd
tidak menjatuhkan hak istimewa dengan sendirinya, orang perlu menambahkan (misalnya) -u mpd
, -g mpd
opsi ke start-stop-daemon
perintah.
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]
dansu: unrecognized option '--debug'