Bash

sudo 沒有 sudo,在腳本中暗示 sudo

  • April 6, 2019

我製作了一些腳本,其中包含一些設計上需要 sudo 權限的功能。我已經在.bashrcforLinux.bash_profilefor中添加了這些路徑,MacOS以便可以從任何地方呼叫它。

但我不希望使用者在sudo每次想要呼叫這些腳本函式時都輸入。有什麼方法可以暗示sudo,每當呼叫這些函式時,終端都會假定它是從 root 使用者呼叫的?

我想我應該sudo -i在腳本的開頭或者每個函式的開頭添加?或者有沒有其他的暗示方式sudo?另外,很高興知道您是否認為暗示 sudo 是可怕的或危險的,以及是否不推薦。

包含一些功能的腳本範例dangerous-function,我試圖在未指定的情況下完成這些功能sudo

#!/bin/bash
start-one()
{
   ## do dangerous stuff with sudo
   systemctl start dangerous.service
}

start-two()
{
   systemctl start dangerous1.service
}

start-launchwizard()
{
   systemctl start dangerous2.service
}

## Calling functions one by one...
"$@"

我不想打電話給他們,sudo dangerous-function start-one 我只想打電話給他們,dangerous-function start-one但仍然得到與前一個相同的結果。

"$@"擴展為命令行參數列表,單獨引用。這意味著如果你呼叫你的腳本

./script.sh start-one

它會start-one在那個時候執行(這是你的功能)。這意味著將其呼叫為

./script.sh ls

它會執行ls

允許使用者使用sudo(或sudo在腳本內部使用)呼叫腳本將允許他們以 root 身份執行任何命令,如果他們有權sudo訪問的話。你不想要這個。

相反,您需要仔細驗證命令行參數。也許像

foo_func () {
   # stuff
   printf 'foo:\t%s\n' "$@"
}

bar_func () {
   # stuff
   printf 'bar:\t%s\n' "$@"
}

arg=$1
shift

case $arg in
   foo)
       foo_func "$@" ;;
   bar)
       bar_func "$@" ;;
   *)
       printf 'invalid sub-command: %s\n' "$arg" >&2
       exit 1
esac

測試:

$ sh script.sh bar 1 2 3
bar:    1
bar:    2
bar:    3
$ sh script.sh baz
invalid sub-command: baz

與 一起使用會更安全sudo,但您仍然不希望在不清理輸入的情況下直接執行使用者在各種功能中提供給您的任何內容。上面的腳本通過將使用者限制為一組特定的子命令來做到這一點,並且處理子命令的每個函式都不會執行 ,eval或其source參數。

讓我再說一遍:腳本不會也不應該嘗試以任何方式將使用者輸入作為程式碼執行。它不應該試圖弄清楚一個參數是否對應於它可以執行的目前環境中的一個函式(函式可能已經被呼叫環境放在那裡)並且它不應該執行其路徑名在命令行等上給出的腳本。

如果腳本正在執行管理任務,我預計必須使用 執行它sudo,並且我不希望腳本本身詢問我的密碼,特別是如果它是我可能想以非互動方式執行的腳本(例如,來自 cron 作業)。也就是說,執行需要 root 權限的管理任務的腳本應該(恕我直言)能夠假定它從一開始就以正確的權限執行。

如果你想在腳本中測試這個,你可以這樣做

if [ "$( id -u )" -ne 0 ]; then
   echo 'please run this script as root' >&2
   exit 1
fi

然後,它將如何以 root 權限執行腳本的決定轉移給腳本的使用者。

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