2012-11-10 39 views
1

下面的代碼檢查,如果你有root權限,然後再次運行該腳本:路徑重新運行作爲須藤時

CMDLN_ARGS="[email protected]" # Command line arguments for this script (if any) 
    export CMDLN_ARGS 
    func_check_for_sudo() { 
     if [ ! $(id -u) -eq 0 ]; then 
       echo "You may be asked for your login password for [`whoami`]." ;sleep 1 
       LAUNCH="`dirname \"${0}\"`" 
       exec sudo -S su -c ${LAUNCH}/$(basename ${0}) ${CMDLN_ARGS} 
     exit ${?} 
    fi 
    } 

如果事情會錯的是,當我把這個腳本放在「$ HOME/bin」文件夾中,所以我可以在沒有路徑的情況下啓動它。它給了我錯誤「沒有這樣的文件或目錄」。我需要腳本來獲取這些信息並正確傳遞給exec。

我的問題是這樣的:如何在不使用路徑的情況下調用正確的腳本時從腳本中正確獲取/ path/to/script_name?回顧一下,我打電話給MY_SCRIPT insead/path/to/MY_SCRIPT,這會打破我的腳本,因爲它必須檢查root權限,如果沒有,請再次運行。

基本上有問題的代碼行是這樣的,其中$ {0}是腳本的名稱(含路徑,如果你有一個叫吧):

exec sudo -S su -c ${0} ${CMDLN_ARGS} 
+0

爲什麼使用'sudo'獲得root權限,然後運行'su'獲得第二次root權限?爲什麼你根本不用運行'exec sudo -S「$ 0」「$ @」'來完全分離'$ LAUNCH'(用一個極其扭曲的代碼行)?如果來自PATH的相關目錄不在root的PATH上,但是無論如何將發生這種情況(如果$ LAUNCH設置爲'。',因爲$ 0不包含路徑組件),這可能會失敗。 –

+0

是的,我只是用啓動來測試的東西,但sudo的原因是,用戶不會知道根本身..謝謝你的意見。不勝感激! :-) –

回答

3

有幾個問題在這裏:

  • 查找腳本的路徑。有幾個簡單的方法可以做到這一點:使用"$BASH_SOURCE"而不是$0;或者只是利用(至少在默認情況下)sudo保留$ PATH的事實,所以sudo "$0" ...將很好地解決腳本。
  • 第二個是腳本不能正確保存它的參數。爭論中的空格將被誤認爲爭論之間的間隔,而通配符將被錯誤地擴展。這是因爲CMDLN_ARGS="[email protected]"將所有參數放在一起用空格分隔,然後${CMDLN_ARGS}在空間上重新分割(可能不是相同的方式)並擴展通配符。

這是我在糾正問題。請注意,將處理函數放在函數中只會增加一層不必要的複雜性,所以我只是把它放在內聯中。我也用sudo的-p選項來稍微清理提示。

if [ $(id -u) -ne 0 ]; then 
    exec sudo -p "Login password for %p: " "$0" "[email protected]" 
    exit $? 
fi 
+0

感謝您的回覆和周到的提示。我仍然有一個問題,但我看到這個:'[itsupport @ oc7626837528〜] $ pwd /home/itsupport [itsupport @ oc7626837528〜] $ which ironkey-helper.x'這意味着如果我通過調用啓動它命令失敗.. 〜/ bin/ironkey-helper.x [itsupport @ oc7626837528〜] $ ironkey-helper.x sudo:ironkey-helper.x:找不到命令 –

+0

我不知道爲什麼它不是找到它,但嘗試使用'「$ BASH_SOURCE」'而不是'「$ 0」'看看是否有效。 –

+0

感謝您的回覆。我注意到這個問題是當我使用shc編譯腳本時...你的代碼有效。 –