Layanan standar untuk memulai root
pada saat boot pada kotak RHEL saya. Jika saya ingat dengan benar, hal yang sama berlaku untuk distro Linux lain yang menggunakan skrip init di /etc/init.d
.
Menurut Anda apa cara terbaik untuk menjalankan proses sebagai pengguna (statis) yang saya pilih?
Satu-satunya metode yang saya gunakan adalah menggunakan sesuatu seperti:
su my_user -c 'daemon my_cmd &>/dev/null &'
Tapi ini sepertinya agak berantakan ...
Apakah ada sedikit keajaiban yang tersimpan yang menyediakan mekanisme mudah untuk secara otomatis memulai layanan seperti pengguna non-root lainnya?
EDIT: Saya seharusnya mengatakan bahwa proses yang saya mulai dalam contoh ini adalah skrip Python atau program Java. Saya lebih suka tidak menulis pembungkus asli di sekitar mereka, jadi sayangnya saya tidak dapat memanggil setuid () seperti yang disarankan Black .
Jawaban:
Pada Debian kita menggunakan
start-stop-daemon
utilitas, yang menangani file pid, mengubah pengguna, menempatkan daemon ke latar belakang dan banyak lagi.Saya tidak terbiasa dengan RedHat, tetapi
daemon
utilitas yang sudah Anda gunakan (yang didefinisikan dalam/etc/init.d/functions
, btw.) Disebutkan di mana-mana sebagai setara denganstart-stop-daemon
, jadi itu juga dapat mengubah uid program Anda, atau cara Anda melakukannya itu sudah benar.Jika Anda melihat-lihat jaring, ada beberapa bungkus siap pakai yang dapat Anda gunakan. Beberapa bahkan mungkin sudah dikemas dalam RedHat. Lihat
daemonize
, misalnya.sumber
/etc/init.d/skeleton
. Tambahkan UID, variabel GID dan sedangdo_start()
digunakan:start-stop-daemon --start --quiet --pidfile $PIDFILE --exec $DAEMON --chuid $UID:$GID -- $DAEMON_ARGS
daemon()
didefinisikan/etc/rc.d/init.d/function
pada kedua kotak RHEL & CentOS milik saya.Setelah melihat semua saran di sini, saya telah menemukan beberapa hal yang saya harap akan bermanfaat bagi orang lain di posisi saya:
hop benar untuk mengarahkan saya kembali ke
/etc/init.d/functions
:daemon
fungsi sudah memungkinkan Anda untuk menetapkan pengguna alternatif:Ini diimplementasikan dengan membungkus doa proses dengan
runuser
- lebih lanjut tentang ini nanti.Jonathan Leffler benar: ada setuid dengan Python:
Saya masih tidak berpikir Anda bisa setuid dari dalam JVM, namun.
Baik
su
maupunrunuser
anggun menangani kasus di mana Anda meminta untuk menjalankan perintah sebagai pengguna yang sudah ada. Misalnya:Untuk mengatasi perilaku itu
su
danrunuser
, saya telah mengubah skrip init saya menjadi sesuatu seperti:Terima kasih atas bantuan Anda!
sumber
Jika Anda bermaksud untuk menulis daemon Anda sendiri, maka saya sarankan memanggil setuid (). Dengan cara ini, proses Anda bisa
sumber
Hanya untuk menambahkan beberapa hal lain yang harus diperhatikan:
sumber
pada mesin virtual CENTOS (Red Hat) untuk svn server: diedit
/etc/init.d/svnserver
untuk mengubah pid ke sesuatu yang dapat ditulis svn:dan opsi tambahan
--user=svn
:Pidfile asli adalah
/var/run/svnserve.pid
. Daemon tidak mulai karena hanya root yang bisa menulis di sana.sumber
Beberapa hal yang harus diperhatikan:
Saya biasanya menggunakan / sbin / su untuk beralih ke pengguna yang sesuai sebelum memulai daemon.
sumber
Mengapa tidak mencoba yang berikut ini di skrip init:
Ini berhasil untuk saya.
sumber
setuid: command not found
Saya perlu menjalankan aplikasi .jar Spring sebagai layanan, dan menemukan cara sederhana untuk menjalankan ini sebagai pengguna tertentu:
Saya mengubah pemilik dan grup file jar saya ke pengguna yang ingin saya jalankan. Kemudian sambungkan toples ini di init.d dan mulai layanan.
Begitu:
sumber