Bash

使用 Sudo 執行 Bash 腳本函式

  • February 4, 2022

我有一個腳本可以做很多不同的事情,其中​​大部分不需要任何特殊權限。但是,我包含在一個函式中的一個特定部分需要 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.

引用自:https://unix.stackexchange.com/questions/269078