2013-07-30 46 views
24

Tôi đang viết một tập lệnh init được cho là thực thi một lệnh đơn lẻ với tư cách người dùng khác với gốc. Đây là cách tôi đang làm nó hiện:
sudo -u username commandLàm thế nào để chạy lệnh với tư cách người dùng cụ thể trong tập lệnh init?

này thường hoạt động như mong đợi trên Ubuntu/Debian, nhưng trên RHEL kịch bản được thực hiện như các command treo.
Có cách nào khác để chạy lệnh với tư cách người dùng khác không?
(Lưu ý rằng tôi không thể sử dụng các hàm init lsb vì chúng không có sẵn trên RHEL/Centos 5.x.)

+2

Lưu ý rằng câu hỏi này là do một quản trị viên nào đó thiết lập (thường là một daemon chạy như một số người dùng để bảo mật). Một trường hợp hơi khác một chút là người dùng thiết lập các lệnh của riêng họ để chạy khi khởi động, với người dùng crontab của họ. Xem http://askubuntu.com/questions/260845/run-a-command-as-user-at-boot-time-ubuntu-12-04 –

Trả lời

15

Trên hệ thống RHEL, kịch bản /etc/rc.d/init.d/functions được thiết kế để cung cấp tương tự như những gì bạn muốn. Nếu bạn mã nguồn ở đầu tập lệnh init, tất cả các chức năng của nó sẽ có sẵn.

Chức năng cụ thể được cung cấp để trợ giúp với điều này là daemon. Nếu bạn đang có ý định sử dụng nó để bắt đầu một chương trình daemon giống như, một cách sử dụng đơn giản sẽ là:

daemon --user=username command 

Nếu đó là quá nặng tay cho những gì bạn cần, có runuser (xem man runuser để biết đầy đủ; một số phiên bản có thể cần -u trước tên người dùng):

/sbin/runuser username -s /bin/bash -c "command(s) to run as user username" 
+4

ít nhất là trên RHEL6, 'runuser' không chấp nhận tham số' -u' và nó sẽ chạy nó như sau: 'runuser username -s/bin/bash - c "lệnh" ' – Richlv

+0

Đối với Centos 7, cũng không nên sử dụng' -u' hoặc lệnh không thành công. Và '/ sbin/runuser username -s/bin/bash -c" lệnh "' hoạt động. – Hustlion

10

Nếu bạn có khởi động stop-daemon

start-stop-daemon --start --quiet -u username -g usergroup --exec command ... 
+3

Nó không có sẵn trong RHEL 5. – ddario

+2

@ddario 'start-stop- daemon' là một Debian-ism. –

+0

Bạn có thể sử dụng 'daemon', như @lagweezle được chỉ ra trong [answer] của mình (http://stackoverflow.com/a/31616592/120794). Nhân tiện, nó phải là câu trả lời được chấp nhận. –

12

Thay vì sudo, hãy thử

su - username command 

Theo kinh nghiệm của tôi, sudo không phải lúc nào cũng có sẵn trên hệ thống RHEL , nhưng su là vì su là một phần của gói lõi trong khi sudo nằm trong gói sudo.

+6

Tôi đã thử điều này, nhưng nó đòi hỏi một mật khẩu cho người sử dụng dịch vụ, mà tôi không có ý định bao giờ thiết lập. Mặt khác, 'sudo -u ' thì không. Lưu ý rằng tôi chạy các tài khoản này với tài khoản người dùng của mình, không phải tài khoản gốc. –

+0

sudo sẽ không hoạt động nếu 'requiretty' được đặt trong/etc/sudoers (mặc định là 6, 7 và fedora 20). – spuder

+0

Cùng một vấn đề ở đây, không thể sử dụng su bởi vì nó đòi hỏi một mật khẩu. Vậy cách tiếp cận tốt nhất cho điều này là gì? Noone dường như có một câu trả lời đúng: ( – gromit190

10

Đối với các tập lệnh init kiểu hệ thống, nó thực sự dễ dàng. Bạn chỉ cần thêm Người dùng = trong phần [Dịch vụ].

Dưới đây là một kịch bản init tôi sử dụng cho qbittorrent-nox trên CentOS 7:

[Unit] 
Description=qbittorrent torrent server 

[Service] 
User=<username> 
ExecStart=/usr/bin/qbittorrent-nox 
Restart=on-abort 

[Install] 
WantedBy=multi-user.target 
+1

systemd có thể gây tranh cãi nhưng điều này chắc chắn là một Tôi sẽ làm điều này cho quá trình máy chủ vault (hashicorp) vault của tôi.bởi – David

+0

Tôi không thực sự theo kịp với bộ phim dev linux :) Tôi đã chỉ tìm thấy systemd dễ dàng để đối phó với kể từ khi centos thông qua nó. Tôi sẽ không bao giờ quay trở lại đống lộn xộn trước đó :) – LOAS