我正在编写一个初始化脚本,它应该以不同于 root 的用户身份执行单个命令。这就是我目前的做法:
sudo -u username command
command
这通常在 Ubuntu/Debian 上按预期工作,但在 RHEL 上,作为挂起执行的脚本。
是否有另一种方法可以以其他用户身份运行命令?
(请注意,我不能使用 lsb init 函数,因为它们在 RHEL/Centos 5.x 上不可用。)
在 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"
对于 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
而不是sudo,尝试
su - username command
以我的经验,sudo在 RHEL 系统上并不总是可用,但su是,因为su是 coreutils 包的一部分,而sudo是在 sudo 包中。
如果你有启动-停止-守护进程
start-stop-daemon --start --quiet -u username -g usergroup --exec command ...
我通常按照您的方式进行操作(即 sudo -u username 命令)。但是,还有一种“djb”方式来运行具有其他用户权限的守护程序。见:http ://thedjbway.b0llix.net/daemontools/uidgid.html
添加此答案是因为我必须查找多个位置才能实现我的用例。我有一个在启动时运行的脚本。此脚本以特定(无密码)用户身份运行进程,并在多种 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