2016-07-18 33 views
1

我正在編寫一個Bourne shell部署腳本,它以root用戶身份運行一些命令,還有一些以當前用戶身份運行。我不想以root用戶身份運行所有命令,並且預先檢查我需要的命令是否可用於root用戶(以防止中止半做完部署)。檢查是否可以在Bourne shell中將命令作爲sudo運行?

爲了做到這一點,我想做一個函數來檢查一個命令是否可以作爲root運行。我的想法是這樣:

sudo_command() { 
    sudo sh -c 'type "$1"' 
} 

然後使用它像這樣:

required_sudo_commands="cp rm apt" 
for command in $required_sudo_commands do 
    sudo_command "$command" || (
     echo "missing required command: $command; 
     exit 1; 
    ) 
done 

正如你可能會在這裏我的問題想:這是行不通的。你們有沒有看到我在這裏做錯了?

我試着在sudo_command裏面運行命令本身,但奇蹟般地(對我)確實有效。但是當我把這個命令放到一個單獨的文件中時,它不起作用。

+0

在什麼情況下,你希望命令完全可用,但不是'root'? – chepner

+0

我期望有一些命令可用於'root',這些命令對當前用戶不可用,因此我會分別檢查這些命令。我更喜歡不用'root'來檢查所有的東西,因爲我認爲用'root'權限來做絕對最小化是個好習慣。 – Willem

回答

5

有兩個直接的問題:

  1. $1不是單引號擴大。

    您可以通過在雙引號擴大它,而不是半解決這個問題:sudo sh -c "type '$1'"

  2. 你的命令不退出。這很容易通過用|| {..}替換|| (..)來解決。

    (..)創建了一個子shell,它限制了它的所有內容,包括exit。要組命令,使用{..}

然而,也有試圖用sh -c 'type "$1"做任何事情的根本問題。

sudo的一個主要問題是限制用戶可以做什麼和不可以做什麼的能力。假設用戶可以完全無限制地以root用戶身份運行任意命令,並且任何問題都歸因於root沒有可用的這些命令。

這對你來說可能是一個有效的假設,但你可能需要運行例如sudo apt --version以獲得更好(但仍不完整)的圖片,說明您是否被允許並能夠在不需要完整和無限制訪問的情況下運行aptsudo

+0

謝謝!這對我有很大的幫助,現在我的腳本還有很長的一段路要走。我檢查命令是否可用的原因是,我希望確保腳本在可能造成破壞 - 如果不成功的操作之前退出的機會很大,因爲我不知道如何完成任務的完美/輕量級回滾shell命令。 – Willem

+0

我最終拿出了這段代碼並在Docker容器中運行我的腳本,這樣,如果我在開發過程中使用我的環境,我可以在一分鐘內重建容器。 – Willem

相關問題