在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"
答案 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
,则仍然会尝试使用正确的用户运行。"$@"
扩展到每个参数,正确引用,因此被认为是重用参数的安全方法。