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 fork
và thậm chí expect daemon
khô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-daemon
khô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-daemon
khô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.
setuidgid
sẽ đư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.setuidgid
từ daemontools-encore và setuidgid
từ 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 newgrp
mộ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... commandname
sẽ 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 runit
gói, một giải pháp thay thế upstart
.
su -c commandname username
cũ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 setuidgid
từ 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-daemon
lệ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 virtualenv
tham 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 PYTHONPATH
là để 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ổ chdir
thơ 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 1700
hoặc ít nhất một chmod u+sx,go-x
trong đó 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`