Cấu hình Systemd Service để chạy với quyền truy cập root


21

Tôi có một dịch vụ dưới dạng một ứng dụng node.js được thiết lập với Systemd trên Raspbian Jessie và nó đang sử dụng tài khoản người dùng của chính nó. Tuy nhiên, tôi thấy rằng dịch vụ không chạy chính xác vì nó không có các quyền cần thiết. Một trong các mô-đun nút tôi cài đặt yêu cầu quyền truy cập root. Nếu tôi chạy ứng dụng bằng tay với sudo thì mọi thứ đều hoạt động tốt.

Có cách nào để bảo systemd chạy dịch vụ với sudo không?


2
Làm thế nào để tập tin đơn vị của bạn trông như thế nào, thêm nó vào câu hỏi của bạn? Thông thường systemdchạy các tập tin đơn vị với quyền root.
Thomas

Câu trả lời:


31

bảo systemd chạy dịch vụ với sudo?

sudo không có gì với nó

Thông thường, bạn hướng dẫn systemd chạy một dịch vụ như một người dùng / nhóm cụ thể với một User=Group=chỉ thị trong [Service]phần của tệp đơn vị.

Đặt chúng thành root (hoặc loại bỏ chúng, vì chạy như root là mặc định).


Tôi đã thiết lập nó để sử dụng một người dùng cụ thể vì tôi đang sử dụng một hướng dẫn để cấu hình nó. Tuy nhiên trong trường hợp của tôi thì điều này không phù hợp. Tôi đã loại bỏ cái này để chạy bằng root theo mặc định và bây giờ mọi thứ đều hoạt động!
Lu-ca

2
Chạy với quyền root không hoàn toàn giống với chạy với User=root. Xem câu trả lời của tôi.
Mark Stosberg

Tập tin này có thể được chỉnh sửa ở đâu?
Matthew


15

Để xóa, systemdcác dịch vụ hệ thống chạy theo root theo mặc định, nhưng vẫn có sự khác biệt giữa hành vi mặc định và chạy dịch vụ hệ thống với User=root.

Như được ghi lại trong các biến Môi trường trong các quy trình được sinh ra , các biến này chỉ được đặt nếu User=được đặt:

$USER, $LOGNAME, $HOME, $SHELL

Tôi đã thử nghiệm để xác nhận phát hiện này. Vì vậy, nếu bạn muốn chạy một dịch vụ systemd như root cần một trong các biến trên, bạn cần phải đặt User=root.


Cảm ơn bạn! Đó là điều duy nhất làm việc cho tôi trên một ứng dụng mà tôi có
Pedro Torres

NB nếu bạn đặt User = root, có lẽ bạn cũng nên đặt Group = root :) superuser.com/a/1452367/39364
rogerdpack

2

một giải pháp tạm thời, nhưng làm cho nó hoạt động trong tình trạng khó khăn:

/usr/bin/sudo /bin/bash -lc 'bundle exec rails server -e demo -p 80'

Có thể chạy với người dùng có đặc quyền sudo trong tệp đơn vị systemd như vậy:

[Unit]
Description=Rails Webserver
After=syslog.target

[Service]
Type=simple
User=ubuntu
WorkingDirectory=/var/www/webserver
ExecStart=/usr/bin/sudo /bin/bash -lc 'bundle exec rails server -e demo -p 80'
Restart=always
KillSignal=SIGQUIT

[Install]
WantedBy=multi-user.target

Điều này có nhiều vấn đề: Đầu tiên, hai câu trả lời đầu tiên giải thích tại sao sử dụng người dùng và sau đó sudo là không cần thiết và chỉ ra cách làm đúng. Thứ hai, dù sao bạn cũng không nên chạy ứng dụng web của mình dưới quyền root. Thứ ba, ứng dụng web của bạn phải đứng sau một máy chủ web bình thường như nginx.
Michael Hampton

Tôi sẽ không đồng ý với bạn về bất kỳ điểm nào của bạn. Nhưng nếu ai đó, giống như tôi, muốn có một máy chủ trần trụi, nhanh như bạn có thể đứng lên của một máy chủ, thì đây là một lựa chọn khả thi có hiệu quả.
daino3

Gần như nhanh như bạn có thể. Rõ ràng việc sử dụng sudosẽ làm chậm khởi động một chút. Và nó không cần thiết.
Michael Hampton

@MichaelHampton Tôi đang cố gắng viết một cửa hậu, vì vậy tôi thấy câu trả lời này hữu ích!
P. Soutzikevich

1

Chạy nó như một người dùng hệ thống trong trường hợp này theo mặc định dịch vụ đang chạy dưới quyền root.

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.