Linux 如何在初始化脚本中以特定用户身份运行命令?

Linux 如何在初始化脚本中以特定用户身份运行命令?,linux,bash,centos,init,rhel,Linux,Bash,Centos,Init,Rhel,我正在编写一个init脚本,它应该以不同于root用户的身份执行单个命令。我现在就是这样做的: sudo-u用户名命令 这通常在Ubuntu/Debian上正常工作,但在RHEL上,作为命令执行的脚本挂起。 是否有其他方法以其他用户的身份运行该命令? (请注意,我不能使用lsb init函数,因为它们在RHEL/Centos 5.x上不可用。)我通常按照您的方式执行(即sudo-u username命令)。但是,还有一种“djb”方式可以使用另一个用户的权限运行守护程序。请参阅:如果您有启动-停

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

这通常在Ubuntu/Debian上正常工作,但在RHEL上,作为
命令执行的脚本挂起。
是否有其他方法以其他用户的身份运行该命令?

(请注意,我不能使用lsb init函数,因为它们在RHEL/Centos 5.x上不可用。)

我通常按照您的方式执行(即sudo-u username命令)。但是,还有一种“djb”方式可以使用另一个用户的权限运行守护程序。请参阅:

如果您有启动-停止守护程序

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

尝试使用sudo而不是sudo

su - username command

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

对于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
[单位]
Description=qbittorrent torrent服务器
[服务]
使用者=
ExecStart=/usr/bin/qbittorrent
重新启动=中止
[安装]
WantedBy=multi-user.target

在RHEL系统上,
/etc/rc.d/init.d/functions
脚本旨在提供与您所需类似的功能。如果在init脚本的顶部找到它的源代码,那么它的所有函数都将可用

为此提供的特定功能是
守护进程
。如果您打算使用它来启动一个类似守护进程的程序,一个简单的用法是:

daemon --user=username command
如果这对您的需要来说过于苛刻,则会出现
runuser
(有关完整信息,请参阅
man-runuser
;某些版本可能需要在用户名之前添加
-u
):


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

1。RHEL/CentOS 6:

source /etc/rc.d/init.d/functions
daemon --user=myUser $JAVA_HOME/bin/java
2。RHEL 7/SUSE12/使用systemd的其他linux版本:

source /etc/rc.d/init.d/functions
daemon --user=myUser $JAVA_HOME/bin/java
在systemd单位文件中添加:

User=myUser
3。Suse 11:

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

/sbin/startproc-u myUser$JAVA\u HOME/bin/JAVA

它在RHEL 5中不可用。@ddario
启动-停止守护程序
是Debian-ism。正如@lagweezle在他/她的文章中指出的,您可以使用
守护程序
。顺便说一句,这应该是公认的答案。
-u/--user
用于检查,您应该添加
-c/--chuid
:在启动流程之前更改此用户名/uid我尝试了此操作,但它需要服务用户的密码,我不打算设置此密码<代码>sudo-u
另一方面,则不是。请注意,我使用我的用户帐户而不是根帐户运行这些。如果在/etc/sudoers中设置了
requirety
(cent 6、7和fedora 20中的默认设置),sudo将不起作用。这里也存在同样的问题,无法使用su,因为它需要密码。那么什么是最好的方法呢?似乎没有人有一个正确的答案:(这就是我在RHEL 6上的工作原理。我还使用了-m标志来保存环境变量:
su-m username命令
注意,这个问题是关于管理员专门设置的内容(通常是作为某个用户运行的守护进程,以确保安全性)。一个稍有不同的情况是,用户使用其用户crontab设置自己的命令以在启动时运行。请至少在RHEL6上看到,
runuser
不接受
-u
参数,您可以这样运行:
runuser username-s/bin/bash-c“command”
对于Centos 7,也不应使用
-u
或命令失败。并且
/sbin/runuser username-s/bin/bash-c“command”有效。对于任何处理错误的人
选项--(shell、fast、命令、会话、会话命令、登录)和--user是互斥的
,以下格式对我有效:
runuser-u username--command
谢谢@lagweezle,这似乎对我启动命令有效,停止该守护进程的最佳方式是什么?在init.d脚本的stop部分?systemd可能有争议,但这肯定是一个不错的con方便。我将为我的(hashicorp)vault服务器进程执行此操作。谢谢。我并没有真正跟上linux开发人员的步伐:)自从centos采用它以来,我发现systemd很容易处理。我再也不会回到之前的混乱状态:)