bash su与init脚本中的参数

时间:2014-02-12 14:39:07

标签: bash init su

在init脚本中,我想用另一个用户调用另一个脚本(在本例中是来自tomcat的catalina.sh)并传递其他参数。

我尝试过这样的事情:

if [ $USER == "root" ]
then
  CMD="/bin/su ${TOMCAT_USER} -c"
fi

$CMD $CATALINA_HOME/bin/catalina.sh stop 20 -force

但是,这会因为“停止”而失败,其他参数将被视为单个文件而不是脚本的参数,并且文件显然不存在。我试图通过使用“$(printf())”来构建必要的命令来解决这个问题,但是却找不到可行的解决方案。我有什么想法可以将其他参数传递给该脚本吗?

修改

在当前用户已经是必需用户的情况下提供更多上下文。这是一个丑陋的解决方法,似乎解决了这个问题:

 if [ $USER == "root" ]
then
  CMD="/bin/su ${TOMCAT_USER} -c '"
  PST="'"
elif [ $USER == "${TOMCAT_USER}" ]
then
  CMD=''
  PST=''
else
  exit 1
fi

bash -c "$CMD$CATALINA_HOME/bin/catalina.sh stop 20 -force$PST"

2 个答案:

答案 0 :(得分:3)

使用以下两种方法中的任何一种来运行命令行:

bash -c "$CMD '$CATALINA_HOME/bin/catalina.sh stop 20 -force'"

OR

eval "$CMD '$CATALINA_HOME/bin/catalina.sh stop 20 -force'"

答案 1 :(得分:0)

为了避免额外的引用问题,您只需将其包装在一个函数中:

run_as_tomcat_user() {
    if [ "${USER-root}" = "root" ]
    then
        /bin/su ${TOMCAT_USER} -c "$@"
    else
        "$@"
    fi
}
run_as_tomcat_user $CATALINA_HOME/bin/catalina.sh stop 20 -force

一对夫妇注意到:

  • "${USER-root}"确保代码在某些原因USER为空或甚至未设置时不会失败。否则,如果root用户已经运行unset USER,则仍然会尝试使用正确的用户运行。
  • "$@"扩展到每个参数,正确引用,因此被认为是重用参数的安全方法。