如何在init脚本中以特定用户身份运行命令?

时间:2013-07-30 19:53:53

标签: linux bash centos init rhel

我正在编写一个init脚本,它应该以不同于root的用户身份执行单个命令。这就是我现在正在做的事情:
sudo -u username command

这通常在Ubuntu / Debian上按预期工作,但在RHEL上,作为command执行的脚本挂起。
还有另一种方法可以将命令作为另一个用户运行吗? (请注意,我不能使用lsb init函数,因为它们在RHEL / Centos 5.x上不可用。)

6 个答案:

答案 0 :(得分:22)

在RHEL系统上,/etc/rc.d/init.d/functions脚本旨在提供与您想要的类似的内容。如果您在init脚本的顶部找到它,那么它的所有功能都可用。

为帮助解决此问题而提供的具体功能是daemon。如果您打算使用它来启动类似守护程序的程序,一个简单的用法是:

daemon --user=username command

如果对于您需要的内容过于严厉,则会runuser(有关完整信息,请参阅man runuser;有些版本可能需要-u才能使用用户名):

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

答案 1 :(得分:12)

如果你有start-stop-daemon

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

答案 2 :(得分:12)

而不是 sudo ,请尝试

su - username command

根据我的经验, sudo 在RHEL系统上并不总是可用,但 su 是,因为 su 是coreutils包的一部分,而 sudo 在sudo包中。

答案 3 :(得分:12)

对于systemd样式的init脚本,它非常简单。您只需在[服务]部分添加用户=。

这是我在CentOS 7上用于qbittorrent-nox的初始化脚本:

[Unit]
Description=qbittorrent torrent server

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

[Install]
WantedBy=multi-user.target

答案 4 :(得分:2)

我通常按照您的方式进行操作(即sudo -u username命令)。但是,还有'djb'方式来运行具有另一个用户权限的守护进程。请参阅:http://thedjbway.b0llix.net/daemontools/uidgid.html

答案 5 :(得分:0)

添加此答案是因为我必须查找多个位置才能实现用例。 我有一个在启动时运行的脚本。该脚本以特定的(无密码)用户身份运行进程,并在多种linux版本上运行。以下是不同口味的选项: (例如,我以Java为目标进程)

1。 RHEL / CentOS 6:

source /etc/rc.d/init.d/functions
daemon --user=myUser $JAVA_HOME/bin/java

2。使用systemd的RHEL 7 / SUSE12 /其他Linux版本: 在系统单位文件中添加:

User=myUser

3。 Suse 11:

/sbin/startproc -u myUser $JAVA_HOME/bin/java