我應該在腳本中使用 sudo 還是在整個腳本中使用 sudo?

我應該在腳本中使用 sudo 還是在整個腳本中使用 sudo?

我為學生運行一小群 macOS 機器(例如 20 台),它們都需要使用自製軟體以及其他軟體包和應用程式進行設定。我正在編寫一個 bash 腳本來自動安裝每台電腦上所需的所有內容。我將使用的一些命令需要以 root 身份運行,但大多數命令不是這樣。

我想知道是否最好在腳本中單獨 sudo 每個命令,或者將 sudo 留在腳本之外並 sudo 整個腳本。我想知道哪一個更安全(安全方面),更適合我的情況。我不想在整個腳本中提示輸入密碼,但我也不想以 root 身份運行腳本中的每一行,因為它不安全。

答案1

遵循最小權限原則,盡可能少地以 root 身分運作。因此,需要在腳本中執行 sudo。

請注意,第一次有需要 sudo 的命令時,可能會提示您。 (如果您在/etc/sudoers 中適當地使用NOPASSWD,則情況並非如此,這是許多人都會迴避的技術,因為它也不安全。)但是,當您運行sudo 並提供密碼時,sudo 會記住成功的訊息一段的時間。預設情況下,該時間段為五分鐘。因此,如果您執行“sudo echo hi”,輸入密碼,然後很快就會執行腳本,那麼在執行腳本時就不需要提示您輸入密碼。更現實的是,如果您只是運行腳本,您可能只會被要求 sudo 一次...假設您的腳本需要不到幾分鐘的時間來完成剩餘的任務。

我可能不擔心幾個echo命令,但如果有不需要額外權限就可以完成的重要內容,那麼,為了安全起見,我通常喜歡以最小的高度來最大化完成的工作量。

作為最小化權限的範例,讓我向您展示另一個範例場景。代替:
sudo -c "sample-command >> /var/log/output.txt"

我喜歡用:
sample-command | sudo tee -a /var/log/output.txt >> /dev/null

透過這樣做,整個命令在沒有 sudo 的情況下運行,並且最終具有增強權限的唯一部分是需要增強權限的部分,即寫入檔案的部分。

顯然,我的目標是盡量減少升高的量。同樣,如果您的整個腳本不需要提升,則首選方法(從安全角度來看)是盡量減少提升的量。

答案2

取決於命令是什麼。對於從互聯網下載的命令,最好不要以 root 身份運行它們。但另一個命令應該可以以 root 身分運行。我要做的是將命令分成兩個腳本:一個用於非根命令,一個用於根命令

如果我能獲得命令列表,也許我可以提供更多幫助。

答案3

通常,(我假設)您希望像任何其他命令/應用程式/實用程式一樣對待腳本。在這種情況下,通常不會提示您輸入密碼來升級您的權限;您只會被拒絕,並收到錯誤。就像是:
Permission denied, 或者Operation not permitted

但是,您特別提到:
“..不想以 root 身份運行腳本中的每一行..”
因此,我真的沒有看到除了顯式地、專門地sudo從相關的特定程式碼行中呼叫之外的替代方法。

您也提到您會:
“......而不是在整個腳本中提示輸入密碼......”
你很可能不會。每次呼叫 sudo 時都不會提示您,除非操作之間經過了很長的時間。

答案4

root這是一種解決方案:以using運行腳本sudo,並以使用 的原始使用者身分執行不需要提升權限的任何命令sudo -u $SUDO_USER <command>

這是一個範例腳本example.sh

#!/bin/bash

if [ "$(whoami)" != "root" ] ; then
    echo "Run this script with sudo" >&2
    exit 1
fi

sudo -u "${SUDO_USER:-$USER}" this_command_run_as_user
this_command_run_as_root
this_command2_run_as_root

你可以像這樣運行它:

sudo ./example.sh

這樣做的優點是,在腳本開始時最多只會請求一次使用者密碼。您無需擔心超時sudo

相關內容