
我有一個簡單的 init.d 腳本,用於啟動和停止進程。我將 init.d 稱為 root,但我希望它控制的進程以特定使用者身分執行。
網路上最常見的建議似乎是
su myuser -c "my_process args"
然而,這會創建第二個進程空間、新的外殼等,並且有些不優雅。
我更喜歡使用exec()
,因為它取代了 shell,但這並不需要使用者作為參數。這是我應該setuid()
首先使用的情況嗎?設定gid怎麼樣?有什麼需要注意的問題嗎?
或者,是否有特定於發行版的解決方案以不同使用者身分執行 init.d ?我的環境是Centos 6.4。
答案1
取決於發行版,但基於 RHEL 的發行版使用它們源自的 Bash 函數,/etc/rc.d/init.d/functions
該daemon
函數本身只是runuser
命令的包裝器。從我在原始檔中可以看出,它在功能上與su
大多數情況下相同,只是不經過 PAM(可能是為了避免在某些情況下出現先有雞還是先有蛋的問題)。
這並不能真正回答你的反對意見,但服務就是這樣做的。您想要的整潔和整體邏輯一致性是諸如此類的動機的一部分systemd
答案2
使用su someuser -c ...
就是所需要的。對於初學者來說,setuid()
這是 shell 程式碼無法使用的系統呼叫。不要讓這件事變得比需要的更困難。