39

我正在编写一个初始化脚本,它应该以不同于 root 的用户身份执行单个命令。这就是我目前的做法:
sudo -u username command

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

4

6 回答 6

26

在 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"
于 2015-07-24T17:38:36.363 回答
16

对于 systemd 风格的初始化脚本来说,这真的很容易。您只需在 [Service] 部分添加一个 User= 。

这是我在 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
于 2014-10-25T17:43:06.523 回答
12

而不是sudo,尝试

su - username command

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

于 2013-07-30T22:01:03.113 回答
12

如果你有启动-停止-守护进程

start-stop-daemon --start --quiet -u username -g usergroup --exec command ...
于 2013-07-30T20:10:43.047 回答
2

我通常按​​照您的方式进行操作(即 sudo -u username 命令)。但是,还有一种“djb”方式来运行具有其他用户权限的守护程序。见:http ://thedjbway.b0llix.net/daemontools/uidgid.html

于 2013-07-30T20:02:13.573 回答
2

添加此答案是因为我必须查找多个位置才能实现我的用例。我有一个在启动时运行的脚本。此脚本以特定(无密码)用户身份运行进程,并在多种 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 版本:

在您的 systemd 单元文件中添加:

User=myUser

3. 使用 11:

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

于 2019-12-09T09:53:33.210 回答