Jawaban:
initctl --version
untuk menemukan versi pemula Anda saat ini.
Bertanya di saluran #upstart di freenode, pejabat yang menangani masalah ini adalah:
Rilis Upstart di masa mendatang akan memiliki dukungan asli untuk itu, tetapi untuk sekarang, Anda dapat menggunakan sesuatu seperti:
exec su -s /bin/sh -c 'exec "$0" "$@"' username -- /path/to/command [parameters...]
su
itu berarti expect fork
dan bahkan expect daemon
tidak menangkap PID terakhir.
exec su -s /bin/sh -c 'HOME=/foo/bar exec "$0" "$@" &>/var/log/foobar.log' username -- /path/to/command [parameters...]
Bagaimana dengan menggunakan start-stop-daemon?
exec start-stop-daemon --start --chuid daemonuser --exec /bin/server_cmd
Dari buku masak pemula :
Metode yang disarankan untuk sistem Debian dan Ubuntu adalah dengan menggunakan utilitas helper
start-stop-daemon
. […]start-stop-daemon
Tidak memaksakan batasan PAM ("Modul Otentikasi Pluggable") pada proses yang dimulai.
Catatan: start-stop-daemon
tidak didukung di RHEL.
Ada beberapa cara untuk melakukannya, semua dengan semantik yang sedikit berbeda, terutama yang berkaitan dengan keanggotaan grup:
setuidgid
akan menempatkan Anda dalam grup yang Anda tentukan.
setuidgid
akan menempatkan Anda dalam grup itu, sehingga Anda tidak akan dapat mengakses file milik grup lain yang menjadi anggota Anda.setuidgid
from daemontools-encore dan setuidgid
dari nosh toolset keduanya memiliki opsi -s
(alias --supplementary
) yang akan menempatkan Anda dalam grup itu, dan juga menempatkan Anda di semua grup tambahan untuk pengguna yang Anda tentukan.Menggunakan newgrp
setelah Anda menjadi pengguna yang kurang beruntung akan menambahkan satu grup ke set grup Anda, tetapi juga membuat subkulit baru, membuatnya sulit untuk menggunakan skrip dalam.
start-stop-daemon
mempertahankan keanggotaan grup Anda, dan melakukan banyak hal lebih dari sekadar setuid / setgid.
chpst -u username:group1:group2:group3... commandname
akan memungkinkan Anda menentukan dengan tepat keanggotaan grup apa yang akan diadopsi, tetapi (dalam Ubuntu ) hanya disertakan dengan runit
paket, yang merupakan alternatif upstart
.
su -c commandname username
mengambil semua keanggotaan grup nama pengguna, seperti halnya sudo -u username commandname
, jadi mereka mungkin rute yang paling tidak mengejutkan.
Gunakan setuidgid
dari paket daemontools
.
Dokumentasi di sini: http://cr.yp.to/daemontools/setuidgid.html
Pada contoh Ubuntu 10.10 di Amazon EC2, saya lebih beruntung dengan start-stop-daemon
perintah itu.
Saya juga berjuang dengan beberapa bait pemula lainnya . Saya memanggil aplikasi python dengan virtualenv
parameter tertentu dan beberapa untuk program saya yang dijalankan.
Berikut ini yang berhasil bagi saya.
script
export PYTHONPATH=.:/home/ubuntu/.local/lib/python2.7/site-packages/:/home/ubuntu/python/lib/python2.7/site-packages/
exec start-stop-daemon --start --chuid ubuntu --exec /home/ubuntu/python_envs/MyProj/bin/python /home/ubuntu/www/MyProj/MyProj.py -- --config-file-dir=/home/ubuntu/www/MyProj/config/ >> /home/ubuntu/startup.log 2>&1 &
end script
The PYTHONPATH
adalah untuk mendapatkan beberapa paket diinstal dari sumber ke PYTHON jalan modul saat pekerjaan pemula ini berjalan. Saya harus melakukan segalanya di jalur absolut karena chdir
bait tampaknya tidak bekerja.
Saya menggunakan CentOS 6, dan saya tidak bisa mendapatkan retasan yang disarankan (untuk Upstart 0.6.5) bekerja untuk saya, juga trik 'su' karena jumlah garpu yang terlibat (4 saya pikir) tidak dilacak oleh 'fork fork 'atau' harapkan daemon '.
Saya akhirnya hanya melakukannya
chown user:group executable
chmod +s executable
(Yaitu mengatur bit setuid dan mengubah kepemilikan).
Ini mungkin bukan metode yang paling aman, tetapi untuk proyek R&D internal, itu tidak masalah dalam kasus kami.
chmod 1700
atau setidaknya chmod u+sx,go-x
di sana, bukan hanya +s
, itu akan memenuhi syarat sebagai "cukup aman." :)
Ada kemungkinan ketiga tergantung pada apa yang ingin Anda capai. Anda mungkin dapat melonggarkan kontrol akses pada file / perangkat yang dimaksud . Ini dapat memungkinkan pengguna yang tidak berkepentingan untuk memasang atau mengakses item yang biasanya tidak diizinkan. Pastikan Anda tidak memberikan kunci kerajaan dalam prosesnya.
Anda juga dapat mengubah batas waktu cache kata sandi sudo . Tetapi saya tidak merekomendasikannya kecuali mesin Anda secara fisik aman (yaitu, Anda yakin bahwa orang yang lewat tidak akan berusaha mendapatkan akses sudo).
Ada alasan bagus bahwa ada sangat sedikit cara untuk melakukan tindakan istimewa dan bahwa mereka melakukan penebangan yang tidak perlu . Pembatasan longgar akan menjadi bahaya keamanan untuk sistem Anda, dan kurangnya pencatatan berarti tidak ada cara untuk mengetahui apa yang terjadi ketika Anda telah dikompromikan.
Jika ukuran file log Anda mengkhawatirkan maka ada sesuatu yang mungkin salah. Sudo hanya menghasilkan satu baris per penggunaan dalam kondisi normal.
Di CentOS 6, pemula 0.6.5, berikut ini yang berhasil bagi saya.
script
exec su user_name << EOF
exec /path/to/command [parameters...]
EOF
end script
atau :
script
exec su user_name << EOF
..... what you want to do ....
EOF
end script
Saat digunakan
exec su -s /bin/sh -c 'exec "$0" "$@"' username -- /path/to/command [parameters...]
proses pekerjaan tidak bisa dihentikan initclt stop
. Saya pikir alasannya adalah:
1. the job forked and the main process is not tracked.
2. the main process changed its process group,because of `su -c`