
我為學生運行一小群 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
。