Khởi chạy tiến trình với tư cách là một người dùng / nhóm khác (trong tập lệnh init.d)


10

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:


12

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 dường như không thích điều đó tôi đưa ra nhiều tranh luận. Tôi nhận Usage: su [options] [LOGIN]su: unrecognized option '--debug'

Nó không chính xác làm việc. Khi tôi thực thi dòng này với quyền root, tôi gặp lỗi 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?

2
@ acidzombie24 sucó 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 MONOSERVERWEBAPPSđượ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ó.
Gilles 'SO- ngừng trở nên xấu xa'

Gilles: Được rồi, tôi không thay thế tập lệnh init.d bằng cái đó phải không? Tôi có thể đặt tất cả các biến vào một tập lệnh mới và khởi chạy nó vì nó dễ dàng và tôi sẽ không phải học bất cứ điều gì. Nhưng có gì đặc biệt về start-stop-daemon? Tôi sẽ để lại nhận xét về câu trả lời đó

Nó là tốt hơn để sử dụng su hoặc su -login? Tôi đã đọc người đàn ông của su nhưng tôi không thể hiểu cho trường hợp cụ thể này
Massimo

4

Nếu start-stop-daemoncó 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-gtrong trường hợp này).

(Nếu không, bạn có thể sử dụng kết hợp susg.)

Cập nhật: Dưới đây là một ví dụ được lấy từ một số /etc/init.d/mpdtậ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/mpdchí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 mpdkhô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 mpdtùy chọn để các start-stop-daemonlệnh.


Tôi không thay thế tập lệnh init.d bằng start-stop-daemon phải không? nó sẽ không dễ dàng hơn để sử dụng su và một tập tin script? Nếu tôi thay thế init.d, làm thế nào để tôi cài đặt nó để chạy khi khởi động? những gì tôi đang chuyển đến start-stop-daemon? -edit- tôi đang lấy ví dụ về ATM Có thể tôi không cần câu trả lời nhưng tôi cảm thấy đây sẽ là một câu trả lời phức tạp

2
Không may mắn. Đây là dòng của tôi. Nó vẫn chạy như root. Tôi đã kiểm tra các trang người đàn ông và tôi vẫn không biết phải làm gì về việc này. 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
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.