以另一个用户/组的身份启动进程(在init.d脚本中)


10

我正在编辑init.d脚本。init.d脚本运行一个实用程序脚本,然后该脚本运行一个进程。从这两种bash脚本中,我如何使它作为特定的用户和组启动主进程?

Answers:


12

最简单的方法是使用su(1)命令,它具有允许您通过用户的外壳程序运行命令的选项,例如:

su foo -c ls

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

# 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

苏似乎不喜欢我给它很多论点。我得Usage: su [options] [LOGIN]su: unrecognized option '--debug'

它不完全正常。当我以root身份执行此行时,su www-data -c ${MONOSERVER} /applications=${WEBAPPS} /socket=unix:/path/monoserve.pid &如果我su www-data设置了所有var并运行,${MONOSERVER} /applications=${WEBAPPS} /socket=unix:/path/monoserve.pid &则会收到错误消息。我该如何解决呢?

2
@ acidzombie24 su接受一个参数,这是一个shell命令。您需要编写su www-data -c '$MONOSERVER "/application=$WEBAPPS" "/socket=unix:/path/monoserve.pid"',并确保MONOSERVERWEBAPPS被父shell导出。(注意:请不要这样做,su … -c "$MONOSERVER …"因为如果任何变量包含shell特殊字符都将失败。)并且,如果您有专用的守护程序启动器(例如)start-stop-daemon,请使用它。
吉尔(Gilles)'所以

吉尔斯:好的,我不是用那代替init.d脚本吗?我可以将所有变量放入一个新脚本中,然后启动它,因为这很容易,而且我无需学习任何东西。但是start-stop-daemon有何特别之处?我将对这个答案发表评论

使用su或su -login更好吗?我读过su的书,但对于这种特殊情况我听不懂
Massimo

4

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

(否则,你可能会使用的组合susg。)

更新:这是一些/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命令。


我不是用start-stop-daemon替换init.d脚本吗?使用su和脚本文件会更容易吗?如果我替换init.d,应如何安装才能在启动时运行?我要传递给start-stop-daemon的什么信息?-编辑-我正在使用自动取款机搜索示例,也许我不需要答案,但是我觉得它会是一个复杂的答案

2
没运气。这是我的电话。它仍然以root身份运行。我检查了手册页,但我仍然不知道该怎么办。start-stop-daemon --start --quiet --background -u www-data -g www-data --exec ${MONOSERVER} --pidfile /path/monoserve.pid --make-pidfile -- /applications=${WEBAPPS} /socket=unix:/path/monoserve.pid
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.