跳至內容跳至頁面導覽:上一頁 [access key p]/下一頁 [access key n]
documentation.suse.com / SUSE Linux Enterprise Server 文件 / 管理指南 / 一般任務 / sudo 基本知識
適用範圍 SUSE Linux Enterprise Server 15 SP3

2 sudo 基本知識

執行某些指令需要 root 特權。但是,出於安全及避免出錯考量,我們不建議您以 root 身分登入。更安全的做法是先以一般使用者身分登入,再使用 sudo 以提升的特權來執行指令。

SUSE Linux Enterprise Server 上,sudo 設定為與 su 的運作方式類似。但是,sudo 提供了一種靈活機制,可讓使用者使用其他任何使用者的特權執行指令。此舉可以將具有特定權限的角色指定給某些使用者和群組。例如,可以允許 users 群組的成員以 wilber 使用者的特權執行指令。您可以透過禁止任何指令選項,來進一步限制對指令的存取。su 始終要求必須提供 root 密碼才能使用 PAM 進行驗證,但 sudo 可以設定為使用您自己的身分證明進行驗證。這表示使用者無需共用 root 密碼,因而提高了安全性。

2.1 sudo 基本用法

以下章節將會介紹 sudo 的基本用法。

2.1.1 執行單個指令

做為一般使用者,您可以在指令前加上 sudo 來以 root 身分執行任何指令。系統會提示您提供 root 密碼。如果驗證成功,便會以 root 身分執行指令:

tux > id -un1
tux
tux > sudo id -un
root's password:2
root
tux > id -un
tux3
tux > sudo id -un
4
root

1

id -un 指令會列印目前使用者的登入名稱。

2

輸入期間不會顯示密碼 (無論是純文字還是遮罩字元均不顯示)。

3

只有以 sudo 開頭的指令才會以提升的特權執行。

4

提升的權限會持續一段時間,因此您不必再次提供 root。密碼。

提示
提示:I/O 重新導向

使用 sudo 時,I/O 重新導向不起作用:

tux > sudo echo s > /proc/sysrq-trigger
bash: /proc/sysrq-trigger: Permission denied
tux > sudo cat < /proc/1/maps
bash: /proc/1/maps: Permission denied

在上面的範例中,只有 echocat 指令才以提升的特權執行。重新導向將由使用者的外圍程序以使用者特權執行。若要以提升的特權執行重新導向,請如第 2.1.2 節 「啟動外圍程序」中所述啟動外圍程序,或使用 dd 公用程式:

echo s | sudo dd of=/proc/sysrq-trigger
sudo dd if=/proc/1/maps | cat

2.1.2 啟動外圍程序

使用 sudo 來以提升的特權執行指令的做法並不總是可行。雖然可以使用 sudo bash 指令,但還是建議您使用以下其中一種內建機制來啟動外圍程序:

sudo -s (<指令>)

啟動由 SHELL 環境變數所指定的外圍程序或目標使用者的預設外圍程序。如果指定了某個指令,該指令將被傳送到外圍程序(使用 -c 選項)。否則,外圍程序將以互動式模式執行。

tux:~ > sudo -s
root's password:
root:/home/tux # exit
tux:~ > 
sudo -i (<指令>)

-s 類似,但會做為登入外圍程序啟動外圍程序。這表示系統會處理該外圍程式的啟動檔案 (.profile 等),並將目前的工作目錄設定為目標使用者的主目錄。

tux:~ > sudo -i
root's password:
root:~ # exit
tux:~ > 
提示
提示:環境變數

sudo 依預設不會傳播環境變數。使用 env_reset 選項會導致行為發生變化,請參閱有用的旗標和選項

2.2 設定 sudo

sudo 提供了各種可設定的選項。

注意
注意:因鎖定而無法使用 sudo

如果您不小心將自己鎖定在 sudo 之外,則可以使用 su -root 密碼來啟動 root 外圍程序。若要修復該錯誤,請執行 visudo

2.2.1 編輯組態檔案

sudo 的主要規則組態檔案為 /etc/sudoers。如果該檔案的格式錯誤,您可能便無法進入系統,因此強烈建議您使用 visudo 來進行編輯。visudo 可以防止發生編輯衝突,並會在儲存修改內容之前檢查語法錯誤。

您可以透過設定 EDITOR 環境變數來使用 vi 以外的另一種編輯器,例如:

sudo EDITOR=/usr/bin/nano visudo

請注意,/etc/sudoers 檔案是由系統套件提供的,直接在該檔案中進行修改可能會中斷更新。因此,建議將自訂組態存入 /etc/sudoers.d/ 目錄下的檔案中。使用以下指令建立或編輯檔案:

sudo visudo -f /etc/sudoers.d/NAME

以下指令使用另一種編輯器 (在本例中為 nano) 開啟檔案:

sudo EDITOR=/usr/bin/nano visudo -f /etc/sudoers.d/NAME
注意
注意:/etc/sudoers.d 中忽略的檔案

/etc/sudoers 中的 #includedir 指令會忽略以 ~ (波狀符號) 字元結尾或包含 . (點) 字元的檔案。

如需 visudo 指令的詳細資訊,請執行 man 8 visudo

2.2.2 sudoers 組態的基本語法

sudoers 組態檔案包含兩種類型的選項:字串和旗標。其中,字串可以包含任何值,旗標可以開啟或關閉。sudoers 組態檔案最重要的語法建構為:

# Everything on a line after # is ignored 1
Defaults !insults # Disable the insults flag 2
Defaults env_keep += "DISPLAY HOME" # Add DISPLAY and HOME to env_keep
tux ALL = NOPASSWD: /usr/bin/frobnicate, PASSWD: /usr/bin/journalctl 3

1

存在兩個例外:#include#includedir 是一般指令。

2

移除 ! 字元可將所需旗標設定為 ON。

3

請參閱第 2.2.3 節 「基本 sudoers 規則」

有用的旗標和選項
targetpw

此旗標控制呼叫使用者是否需要輸入密碼。如果要求輸入目標使用者 (例如 root) 的密碼則為開啟,如果要求輸入其自己的密碼則為關閉。

Defaults targetpw # Turn targetpw flag ON
rootpw

如果設定,sudo 將提示輸入 root 密碼。預設值為 OFF。

Defaults !rootpw # Turn rootpw flag OFF
env_reset

如果設定,sudo 會建構一個包含 TERMPATHHOMEMAILSHELLLOGNAMEUSERUSERNAMESUDO_* 的精簡環境。此外,會從呼叫環境輸入 env_keep 中列出的變數。預設為開啟。

Defaults env_reset # Turn env_reset flag ON
env_keep

env_reset 旗標為開啟時要保留的一系列環境變數。

# Set env_keep to contain EDITOR and PROMPT
Defaults env_keep = "EDITOR PROMPT"
Defaults env_keep += "JRE_HOME" # Add JRE_HOME
Defaults env_keep -= "JRE_HOME" # Remove JRE_HOME
env_delete

env_reset 旗標為關閉時要移除的一系列環境變數。

# Set env_delete to contain EDITOR and PROMPT
Defaults env_delete = "EDITOR PROMPT"
Defaults env_delete += "JRE_HOME" # Add JRE_HOME
Defaults env_delete -= "JRE_HOME" # Remove JRE_HOME

Defaults 記號還可用於建立使用者、主機和指令三者之集合的別名。除此之外,還可以將某選項僅套用到一組特定的使用者。

如需 /etc/sudoers 組態檔案的詳細資訊,請諮詢 man 5 sudoers

2.2.3 基本 sudoers 規則

每個規則都遵循以下規劃 ([] 表示可選部分):

#Who      Where         As whom      Tag                What
User_List Host_List = [(User_List)] [NOPASSWD:|PASSWD:] Cmnd_List
sudoers 規則語法
User_List

一或多個 (用逗號分隔) 識別碼:使用者名稱、以 %GROUPNAME 格式表示的群組,或是以 #UID 格式表示的使用者 ID。可以使用 ! 字首來否定。

Host_List

一或多個 (用逗號分隔) 識別碼:完全合格的主機名稱或 IP 位址。可以使用 ! 字首來否定。Host_List 的常用選項為 ALL

NOPASSWD:|PASSWD:

如果使用者在 NOPASSWD: 之後執行的指令與 Cmd_List 相符,系統不會提示使用者輸入密碼。

PASSWD 是預設選項。僅當 PASSWDNOPASSWD 位於同一行時,才需要指定此選項:

tux ALL = PASSWD: /usr/bin/foo, NOPASSWD: /usr/bin/bar
Cmnd_List

一或多個 (用逗號分隔) 指定元:可執行檔的路徑,後跟允許使用的可選引數。

/usr/bin/foo     # Anything allowed
/usr/bin/foo bar # Only "/usr/bin/foo bar" allowed
/usr/bin/foo ""  # No arguments allowed

ALL 可以用作 User_ListHost_ListCmnd_List

允許 tux 在無需輸入密碼的情況下以 root 身分執行所有指令的規則:

tux ALL = NOPASSWD: ALL

允許 tux 執行 systemctl restart apache2 的規則:

tux ALL = /usr/bin/systemctl restart apache2

允許 tux 在不帶任何引數的情況下以 admin 身分執行 wall 的規則:

tux ALL = (admin) /usr/bin/wall ""
警告
警告:不安全的規則

不要使用不帶 Defaults targetpwALL ALL = ALL 等規則。否則,任何人都能夠以 root 身分執行指令。

2.3 sudo 使用案例

雖然預設組態可適用於標準使用情境,但您仍可依據特定需求自訂預設組態。

2.3.1 在無需提供 root 密碼的情況下使用 sudo

依設計,wheel 群組的成員可以用 root 身分執行所有帶有 sudo 的指令。下面的程序介紹如何將使用者帳戶新增至 wheel 群組。

  1. 將您的使用者帳戶新增至 wheel 群組。

    如果您的使用者帳戶還不是 wheel 群組的成員,請使用 sudo usermod -a -G wheel USERNAME 指令新增。登出然後重新登入即可啟用變更。執行 groups USERNAME 指令以驗證變更是否成功。

  2. 使用使用者帳戶的普通密碼進行驗證。

    使用 visudo 指令建立檔案 /etc/sudoers.d/userpw (請參閱第 2.2.1 節 「編輯組態檔案」) 並新增以下內容:

    Defaults !targetpw
  3. 選取新的預設規則。

    依據是否希望使用者重新輸入其密碼,在 /etc/sudoers 中取消備註相應的行,並將預設規則設定為備註。

    ## Uncomment to allow members of group wheel to execute any command
    # %wheel ALL=(ALL) ALL
    
    ## Same thing without a password
    # %wheel ALL=(ALL) NOPASSWD: ALL
  4. 對預設規則設定更多限制.

    移除 /etc/sudoers 中的 allow-everything 規則或設定為備註:

    ALL     ALL=(ALL) ALL   # WARNING! Only use this together with 'Defaults targetpw'!
    警告
    警告:sudoers 中可造成嚴重後果的規則

    請勿跳過此步驟。否則任何使用者都能以 root 身分執行任何指令!

  5. 測試組態.

    wheel 成員身分和非成員身分執行 sudo

    tux:~ > groups
    users wheel
    tux:~ > sudo id -un
    tux's password:
    root
    wilber:~ > groups
    users
    wilber:~ > sudo id -un
    wilber is not in the sudoers file.  This incident will be reported.

2.3.2 對 X.Org 應用程式使用 sudo

使用 sudo 啟動圖形應用程式通常會導致以下錯誤:

tux > sudo xterm
xterm: Xt error: Can't open display: %s
xterm: DISPLAY is not set

一種簡單的解決方式是使用 xhost 來暫時允許 root 使用者存取本地使用者的 X 工作階段。可使用以下指令完成此動作:

xhost si:localuser:root

以下指令可移除授予的存取權:

xhost -si:localuser:root
警告
警告:潛在安全問題

以 root 特權執行圖形應用程式存在安全隱患。建議僅在例外的情況下,才啟用對圖形應用程式的 root 存取權。另外,建議在關閉圖形應用程式後,立即撤銷授予的 root 存取權。

2.4 更多資訊

sudo --help 指令提供可用指令行選項的簡要綜覽,而 man sudoers 指令則會提供有關 sudoers 及其組態設定的詳細資訊。