bash su 与初始化脚本中的参数



在初始化脚本中,我想调用另一个具有不同用户的脚本(在本例中为来自 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 种方法中的任何一种来运行命令行:

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

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

为了避免额外的引用问题,您可以简单地将其包装在一个函数中:

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。否则,如果由于某种巧合,根用户运行了unset USER,它仍然会尝试使用正确的用户运行。
  • "$@"扩展到每个参数,正确引用,因此被认为是重用参数的安全方法。

相关内容

  • 没有找到相关文章

最新更新