2014-02-12 44 views
2

在初始化腳本中,我想用另一個用戶調用另一個腳本(本例中爲tomcat中的catalina.sh)並傳遞其他參數。在初始化腳本中使用參數bash su

我已經試過這樣的事情:

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

我們需要看到catalina.sh – suspectus

+0

@suspectus [catalina.sh(https://svn.apache.org/repos/asf/tomcat/trunk/bin/catalina.sh) –

回答

3

使用其中任何一個2種方式運行命令行:

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

OR

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

如果它工作,然後考慮將其標記爲已接受。 – anubhava

+0

不幸的是,我不能得到這個工作在SLES上:'env:/ bin/su tomcat /srv/tomcat7/latest/bin/catalina.sh stop 20 -force第二個答案和第一個答案沒有這樣的文件或目錄答案導致:'/ bin/su:無效的選項-o' –

+0

奇怪,是否'eval「$ CMD $ CATALINA_HOME/bin/catalina.sh stop 20 -force」'work? – anubhava

0

爲了避免額外報價問題你可以簡單地把它包裝在一個函數中:

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

一對夫婦的注意事項:

  • "${USER-root}"確保代碼不會失敗如果由於某種原因USER是空的,甚至未設置。否則,如果一些巧合,root用戶運行unset USER,它仍然會嘗試使用正確的用戶運行。
  • "[email protected]"擴展到每個參數,正確引用,因此被認爲是重用參數的安全方法。
+0

,不幸的是在SLES'/ bin/su上導致錯誤:無效的選項-o' –

+0

@codeySmurf嘗試'set -x'來查看它實際執行的內容。 – l0b0

+0

我在'run_as_tomcat_user()函數的開頭添加了'set -x'。這是輸出:http://pastebin.com/kGfyzsiV –