在初始化脚本中,我想调用另一个具有不同用户的脚本(在本例中为来自 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
,它仍然会尝试使用正确的用户运行。 -
"$@"
扩展到每个参数,正确引用,因此被认为是重用参数的安全方法。