sudo 沒有 sudo,在腳本中暗示 sudo
我製作了一些腳本,其中包含一些設計上需要 sudo 權限的功能。我已經在
.bashrc
forLinux
和.bash_profile
for中添加了這些路徑,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 權限執行腳本的決定轉移給腳本的使用者。