Tôi đang chỉnh sửa một tập lệnh init.d. Kịch bản init.d chạy một kịch bản tiện ích, sau đó chạy một tiến trình. Từ các tập lệnh bash, làm thế nào để tôi khởi chạy quy trình chính với tư cách là một người dùng và nhóm cụ thể?
Tôi đang chỉnh sửa một tập lệnh init.d. Kịch bản init.d chạy một kịch bản tiện ích, sau đó chạy một tiến trình. Từ các tập lệnh bash, làm thế nào để tôi khởi chạy quy trình chính với tư cách là một người dùng và nhóm cụ thể?
Câu trả lời:
Cách đơn giản nhất là sử dụng lệnh su (1), nó có một tùy chọn cho phép bạn chạy một lệnh thông qua trình bao của người dùng, ví dụ:
su foo -c ls
Điều này sẽ chuyển sang người dùng foo và chạy lệnh ls. Nếu người dùng bạn muốn sử dụng không có shell hợp lệ (nghĩa là nó không có trong / etc / shell, như / bin / false hoặc / sbin / nologin), bạn cũng sẽ phải chỉ định shell trên dòng lệnh. Ví dụ với đầu ra:
# 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 &
nếu tôi su www-data
đặt tất cả các vars và chạy ${MONOSERVER} /applications=${WEBAPPS} /socket=unix:/path/monoserve.pid &
nó hoạt động tốt. Làm thế nào để tôi giải quyết điều này?
su
có một đối số duy nhất, đó là lệnh shell. Bạn cần ghi su www-data -c '$MONOSERVER "/application=$WEBAPPS" "/socket=unix:/path/monoserve.pid"'
, và chắc chắn rằng MONOSERVER
và WEBAPPS
được xuất khẩu bằng vỏ mẹ. (Lưu ý: không làm su … -c "$MONOSERVER …"
như vậy sẽ thất bại nếu bất kỳ biến nào chứa các ký tự đặc biệt shell.) Và nếu bạn có một trình khởi chạy daemon chuyên dụng nhưstart-stop-daemon
, hãy sử dụng nó.
Nếu start-stop-daemon
có sẵn trên hệ thống của bạn, có lẽ bạn nên sử dụng nó và xem xét các tùy chọn của nó (đặc biệt -u
và -g
trong trường hợp này).
(Nếu không, bạn có thể sử dụng kết hợp su
và sg
.)
Cập nhật: Dưới đây là một ví dụ được lấy từ một số /etc/init.d/mpd
tập lệnh (sử dụng start-stop-daemon
):
Lệnh bắt đầu:
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
Tất cả mọi thứ sau đây --
là một đối số cho /usr/bin/mpd
chính chương trình. (Quy trình trình nền được chăm sóc bởi tập lệnh start-stop-daemon nên mpd
được yêu cầu không quan tâm đến nó --nodaemon
.)
Lệnh dừng:
echo "Stopping Music Player Daemon"
start-stop-daemon --stop --exec /usr/bin/mpd --pidfile /var/run/mpd.pid
Nếu mpd
không được bỏ đặc quyền của riêng của mình, người ta sẽ cần thêm (ví dụ) -u mpd
, -g mpd
tùy chọn để các start-stop-daemon
lệnh.
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]
vàsu: unrecognized option '--debug'