作为另一个用户/组启动进程(在 init.d 脚本中)

作为另一个用户/组启动进程(在 init.d 脚本中)

我正在编辑 init.d 脚本。 init.d 脚本运行一个实用程序脚本,然后该脚本运行一个进程。从任一 bash 脚本中,我如何让它以特定用户和组身份启动主进程?

答案1

最简单的方法是使用 su(1) 命令,它有一个选项允许您通过用户的 shell 运行命令,例如:

su foo -c ls

这将切换到用户并运行 ls 命令。如果您要使用的用户没有有效的 shell(即不在 /etc/shells 中,如 /bin/false 或 /sbin/nologin),您还必须在命令行上指定 shell。输出示例:

# su nobody -s /bin/bash -c id
uid=99(nobody) gid=99(nobody) groups=99(nobody) context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023

答案2

如果start-stop-daemon您的系统上可用,您可能应该使用它并查看它的选项(尤其-u-g在这种情况下)。

su(否则,您可以使用和的组合sg。)

更新:这是取自某个脚本的示例/etc/init.d/mpd(使用start-stop-daemon):

  • 启动命令:

    echo "Starting Music Player Daemon"
    start-stop-daemon --start --quiet --background --exec /usr/bin/mpd \
        --pidfile /var/run/mpd.pid --make-pidfile \
        -- --no-daemon /etc/mpd.conf 2>/dev/null
    

    接下来的一切--都是程序本身的论证/usr/bin/mpd。 (守护程序过程由 start-stop-daemon 脚本负责,因此mpd要求不要用 来关心它--nodaemon。)

  • 停止命令:

    echo "Stopping Music Player Daemon"
    start-stop-daemon --stop --exec /usr/bin/mpd --pidfile /var/run/mpd.pid
    

如果mpd不自行删除权限,则需要向命令添加(例如)-u mpd,-g mpd选项start-stop-daemon

相关内容