Câu trả lời:
initctl --versionđể tìm phiên bản mới nhất hiện tại của bạn.
Hỏi kênh #upstart trên freenode, vấn đề chính thức là:
Một bản phát hành Upstart trong tương lai sẽ có hỗ trợ riêng cho điều đó, nhưng hiện tại, bạn có thể sử dụng một cái gì đó như:
exec su -s /bin/sh -c 'exec "$0" "$@"' username -- /path/to/command [parameters...]
suđiều đó có nghĩa là expect forkvà thậm chí expect daemonkhông bắt được PID cuối cùng.
exec su -s /bin/sh -c 'HOME=/foo/bar exec "$0" "$@" &>/var/log/foobar.log' username -- /path/to/command [parameters...]
Làm thế nào về việc sử dụng start-stop-daemon?
exec start-stop-daemon --start --chuid daemonuser --exec /bin/server_cmd
Phương pháp được đề xuất cho các hệ thống Debian và Ubuntu là sử dụng tiện ích trợ giúp
start-stop-daemon. [V]]start-stop-daemonkhông áp đặt các giới hạn PAM ("Mô đun xác thực có thể cắm") cho quy trình mà nó bắt đầu.
Lưu ý: start-stop-daemonkhông được hỗ trợ trong RHEL.
Có một số cách để làm điều đó, tất cả đều có ngữ nghĩa hơi khác nhau, đặc biệt liên quan đến thành viên nhóm:
setuidgid sẽ đưa bạn vào nhóm bạn chỉ định.
setuidgidsẽ đưa bạn chỉ trong nhóm đó, vì vậy bạn sẽ không thể truy cập các tập thuộc các nhóm khác bạn là một thành viên của.setuidgidtừ daemontools-encore và setuidgidtừ bộ công cụ nosh đều có tùy chọn -s(aka --supplementary) sẽ đưa bạn vào nhóm đó và cũng đưa bạn vào tất cả các nhóm bổ sung cho người dùng mà bạn chỉ định.Sử dụng newgrpmột khi bạn trở thành người dùng ít đặc quyền hơn sẽ thêm một nhóm vào nhóm của bạn, nhưng cũng tạo ra một lớp con mới, khiến cho việc sử dụng bên trong các tập lệnh trở nên khó khăn.
start-stop-daemon duy trì tư cách thành viên nhóm của bạn và thực hiện nhiều hơn là chỉ setuid / setgid.
chpst -u username:group1:group2:group3... commandnamesẽ cho phép bạn chỉ định chính xác thành viên nhóm nào sẽ áp dụng, nhưng (trong Ubuntu ) nó chỉ đi kèm với runitgói, một giải pháp thay thế upstart.
su -c commandname usernamecũng chọn tất cả các thành viên nhóm của tên người dùng sudo -u username commandname, vì vậy họ có thể là con đường ít gây ngạc nhiên nhất.
Sử dụng setuidgidtừ gói daemontools.
Tài liệu ở đây: http://cr.yp.to/daemontools/setuidgid.html
Trên phiên bản Ubuntu 10.10 trên Amazon EC2, tôi đã gặp may mắn hơn với start-stop-daemonlệnh này.
Tôi cũng vật lộn với một số khổ thơ mới nổi khác . Tôi đang gọi một ứng dụng python với một virtualenvtham số cụ thể và một số tham số cho chương trình thực thi của tôi.
Sau đây là những gì làm việc cho tôi.
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
Các PYTHONPATHlà để có được một số gói cài đặt từ nguồn vào PYTHON đường module khi công việc mới nổi này chạy. Tôi đã phải làm mọi thứ theo những con đường tuyệt đối vì khổ chdirthơ dường như không hoạt động.
Tôi đã sử dụng CentOS 6 và tôi không thể sử dụng bản hack được đề xuất (cho Upstart 0.6.5) để hoạt động cho tôi, cũng không phải là mẹo 'su' vì số lượng dĩa liên quan (4 tôi nghĩ) không được theo dõi bởi 'mong đợi ngã ba 'hoặc' mong đợi daemon '.
Cuối cùng tôi cũng đã làm
chown user:group executable
chmod +s executable
(tức là đặt bit setuid và thay đổi quyền sở hữu).
Nó có thể không phải là phương pháp an toàn nhất, nhưng đối với một dự án R & D nội bộ, nó không thành vấn đề trong trường hợp của chúng tôi.
chmod 1700hoặc ít nhất một chmod u+sx,go-xtrong đó thay vì chỉ +s, nó sẽ đủ điều kiện là "đủ an toàn." :)
Có khả năng thứ ba tùy thuộc vào những gì bạn đang cố gắng thực hiện. Bạn có thể nới lỏng các điều khiển truy cập trên các tệp / thiết bị được đề cập . Điều này có thể cho phép người dùng không có đặc quyền gắn kết hoặc truy cập các mục mà họ thường không được phép. Chỉ cần chắc chắn rằng bạn không trao chìa khóa cho vương quốc trong quá trình này.
Bạn cũng có thể thay đổi thời gian chờ của bộ đệm mật khẩu sudo . Nhưng tôi không khuyến nghị điều đó trừ khi máy của bạn an toàn về mặt vật lý (nghĩa là bạn tin rằng người đi đường sẽ không có quyền truy cập sudo).
Có một lý do chính đáng rằng có rất ít cách để thực hiện các hành động đặc quyền và họ thực hiện đăng nhập không cần thiết . Hạn chế lỏng lẻo sẽ là một mối nguy hiểm bảo mật cho hệ thống của bạn và việc thiếu đăng nhập có nghĩa là không có cách nào để biết điều gì đã xảy ra khi bạn bị xâm phạm.
Nếu kích thước của tệp nhật ký của bạn là một mối quan tâm thì có lẽ có gì đó không đúng. Sudo chỉ tạo ra một dòng trên mỗi lần sử dụng trong điều kiện bình thường.
Trong CentOS 6, mới bắt đầu 0.6.5, sau đây là những gì làm việc cho tôi.
script
exec su user_name << EOF
exec /path/to/command [parameters...]
EOF
end script
hoặc là :
script
exec su user_name << EOF
..... what you want to do ....
EOF
end script
Khi sử dụng
exec su -s /bin/sh -c 'exec "$0" "$@"' username -- /path/to/command [parameters...]
quá trình công việc không thể dừng lại initclt stop. Tôi nghĩ lý do là:
1. the job forked and the main process is not tracked.
2. the main process changed its process group,because of `su -c`