2013-07-30 89 views
24

我正在寫一個init腳本,它應該以不同於root的用戶身份執行單個命令。這是我正在做它目前:
sudo -u username command如何在初始化腳本中以特定用戶身份運行命令?

一般情況下會在Ubuntu/Debian的預期,但在RHEL把作爲command掛起執行的腳本。
是否有另一種方式作爲另一個用戶運行命令?
(注意,我不能使用lsb初始化函數,因爲它們在RHEL/CentOS 5.x上不可用)

+2

注意,這個問題是關於一些由管理員設置了專門(通常,運行一些用戶的安全守護進程)。一個稍微不同的情況是用戶使用他們的用戶crontab設置自己的命令以便在引導時運行。請參閱http://askubuntu.com/questions/260845/run-a-command-as-user-at-boot-time-ubuntu-12-04 –

回答

15

在RHEL系統上,/etc/rc.d/init.d/functions腳本旨在提供類似於你想要的東西。如果你在初始化腳本的頂部找到它,那麼它的所有功能都可用。

提供幫助的具體功能是daemon。如果您打算用它來啓動一個守護進程樣的程序,一個簡單的用法是:

daemon --user=username command 

如果太重的手爲你所需要的,有runuser(見man runuser完全信息;某些版本可能需要-u前名):

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

至少在RHEL6上,'runuser'不接受'-u'參數,並且可以像這樣運行它:'runuser username -s/bin/bash - c「command」' – Richlv

+0

對於Centos 7,也不應該使用'-u'或命令失敗。和'/ sbin/runuser username -s/bin/bash -c「命令」'工作。 – Hustlion

10

如果你有啓動 - 停止守護

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

它在RHEL 5中不可用。 – ddario

+2

@ddario'start-stop-守護進程「是一個Debian主義。 –

+0

你可以使用daemon作爲@lagweezle在他/她的[answer](http://stackoverflow.com/a/31616592/120794)中指出的。順便說一下,它應該是被接受的答案。 –

12

而不是須藤,嘗試

su - username command 

以我的經驗,須藤並不總是可用的RHEL系統上,但是su是,因爲su是coreutils包的一部分,而sudo位於sudo包中。

+6

我試過這個,但它需要服務用戶的密碼,我不打算永久設置。 'sudo -u '另一方面,不。請注意,我使用我的用戶帳戶運行這些帳戶,而不是根帳戶。 –

+0

如果'requiretty'在/ etc/sudoers中被設置(缺省分6,7和fedora 20),sudo不會工作。 – spuder

+0

同樣的問題在這裏,不能用su,因爲它需要密碼。那麼對此最好的方法是什麼?沒有人似乎有一個正確的答案:( – gromit190

10

對於systemd樣式的init腳本來說非常簡單。您只需在[服務]部分添加一個用戶=。

下面是一個初始化腳本我用qbittorrent硝在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可能有爭議,但這當然是一個很好的方便,我將爲我的(hashicorp)Vault服務器進程執行此操作,謝謝 – David

+0

我並沒有真正跟上linux dev劇情:)自從centos採用它之後,我剛剛發現systemd很容易處理。我永遠不會回到之前的混亂:) – LOAS

相關問題