Bash
使用 Sudo 執行 Bash 腳本函式
我有一個腳本可以做很多不同的事情,其中大部分不需要任何特殊權限。但是,我包含在一個函式中的一個特定部分需要 root 權限。
我不希望整個腳本以 root 身份執行,並且我希望能夠從腳本中以 root 權限呼叫此函式。必要時提示輸入密碼不是問題,因為它主要是互動式的。但是,當我嘗試使用時
sudo functionx
,我得到:sudo: functionx: command not found
正如我所料,
export
並沒有什麼不同。出於多種原因,我希望能夠直接在腳本中執行該函式,而不是將其分解並作為單獨的腳本執行。有什麼方法可以讓我的函式對 sudo “可見”,而無需提取它、找到適當的目錄,然後將其作為獨立腳本執行?
該函式本身大約有一頁長,包含多個字元串,一些是雙引號,一些是單引號。它還依賴於主腳本中其他地方定義的菜單功能。
我只希望有 sudo ANY 的人能夠執行該功能,因為它所做的事情之一就是更改密碼。
我承認沒有簡單、直覺的方法可以做到這一點,這有點老套。但是,你可以這樣做:
function hello() { echo "Hello!" } # Test that it works. hello FUNC=$(declare -f hello) sudo bash -c "$FUNC; hello"
或者更簡單地說:
sudo bash -c "$(declare -f hello); hello"
這個對我有用:
$ bash --version GNU bash, version 4.3.42(1)-release (x86_64-apple-darwin14.5.0) $ hello Hello! $ $ FUNC=$(declare -f hello) $ sudo bash -c "$FUNC; hello" Hello!
基本上,
declare -f
將返回函式的內容,然後將其傳遞給bash -c
內聯。如果要從 bash 的外部實例導出所有函式,請更改
FUNC=$(declare -f hello)
為FUNC=$(declare -f)
.編輯
要解決有關引用的評論,請參閱此範例:
$ hello() > { > echo "This 'is a' test." > } $ declare -f hello hello () { echo "This 'is a' test." } $ FUNC=$(declare -f hello) $ sudo bash -c "$FUNC; hello" Password: This 'is a' test.