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

dda*_*rio 33 linux bash centos rhel init

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

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

lag*_*zle 24

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

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

daemon --user=username command
Run Code Online (Sandbox Code Playgroud)

如果对于你需要的东西太过苛刻,那就有runuser(参见man runuser完整信息; -u用户名之前可能需要一些版本):

/sbin/runuser username -s /bin/bash -c "command(s) to run as user username"
Run Code Online (Sandbox Code Playgroud)

  • 至少在RHEL6上,`runuser`不接受`-u`参数,并且可以像这样运行它:`runuser username -s/bin/bash -c"command"` (4认同)

LOA*_*OAS 13

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

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

[Unit]
Description=qbittorrent torrent server

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

[Install]
WantedBy=multi-user.target
Run Code Online (Sandbox Code Playgroud)

  • systemd可能会引起争议,但这肯定是一个很好的方便.我将为我的(hashicorp)Vault服务器进程执行此操作.谢谢. (2认同)

cra*_*ter 12

如果你有start-stop-daemon

start-stop-daemon --start --quiet -u username -g usergroup --exec command ...
Run Code Online (Sandbox Code Playgroud)

  • 它在RHEL 5中不可用. (3认同)
  • @ddario`start-stop-daemon`是一个Debian-ism. (2认同)
  • -u /-user是用来检查的,您应该添加`-c /-chuid`:在开始该过程之前,请更改为该用户名/ uid。 (2认同)

小智 12

而不是sudo,试试吧

su - username command
Run Code Online (Sandbox Code Playgroud)

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

  • 我尝试了这个,但它需要服务用户的密码,我不打算设置.另一方面,`sudo -u <username> <command>`没有.请注意,我使用我的用户帐户运行这些帐户,而不是root帐户. (7认同)