以权限较低的用户身份与 upstart 一起运行 bash 脚本

以权限较低的用户身份与 upstart 一起运行 bash 脚本

/home/jack/myscript.sh这是我要运行的脚本:

export JAVA_HOME=/usr/lib/jvm/java-6-sun-1.6.0.26/
/home/jack/myapp/apache-tomcat-6.0.32/bin/./catalina.sh run

/etc/init/myapp.conf我写的新贵文件:

  description "Myapp Server"
  start on runlevel [2345]
  stop on runlevel [06]
  respawn
  respawn limit 10 5
  exec `su jack -c /home/jack/myscript.sh`

那么,如果我想以 user 身份运行脚本jack,我的上述配置是否有效?有更好的方法吗?

答案1

根据新贵食谱,计划以不同用户身份运行服务的内置功能,但尚未实现。

如果有start-stop-daemon,请使用它。

exec start-stop-daemon --start -u jack --exec /home/jack/myscript.sh

否则,使用su(就像你所做的那样)或sudo.请注意,start-stop-daemon始终切换到指定的用户(除非出现错误),而su和 则sudo遵守其自己的策略(特别是大多数系统上的 PAM 策略)。

请注意,在您的情况下,您不需要中间脚本。您可以直接从 Upstart 服务定义设置环境变量。

description "Myapp Server"
  start on runlevel [2345]
  stop on runlevel [06]
  respawn
  respawn limit 10 5
  env JAVA_HOME=/usr/lib/jvm/java-6-sun-1.6.0.26/
  exec /home/jack/myapp/apache-tomcat-6.0.32/bin/catalina.sh run

答案2

从 Upstart 1.4 开始,Upstart 能够使用setuidsetgid节以指定用户身份运行系统作业,例如:

setuid username
setgid groupname

在以前的版本中我们可以使用用户职位,它们存储在用户主文件夹中。

或者在 exec 命令中使用某些应用程序。

如果start-stop-daemon可用:

exec start-stop-daemon --start -c myuser --exec command

sudo

exec sudo -u myuser command

su

exec su -s /bin/sh -c 'exec "$0" "$@"' myuser -- command [parameters...]

更多信息这里

答案3

如果您想以会话用户身份运行它,只需创建一个会话作业(从 1.7 开始)而不是系统作业。当涉及到环境变量时,此类作业不像系统作业那样受到限制,并且以会话用户的身份执行。

相关内容