跳至內容跳至頁面導覽:上一頁 [access key p]/下一頁 [access key n]
documentation.suse.com / SUSE Linux Enterprise Server 文件 / 管理指南 / 一般工作 / sudo
適用範圍 SUSE Linux Enterprise Server 12 SP5

2 sudo

許多指令與系統公用程式都需要以 root 身分執行,才能修改檔案並/或執行只有進階使用者才能執行的任務。出於安全考量並避免在無意間執行可能造成嚴重後果的指令,一般情況下建議不要以 root 身分登入,而是以無特權的一般使用者身分進行操作,並使用 sudo 指令以執行需要更高權限的指令。

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

2.1 sudo 的基本使用方法

sudo 簡單易用,但能力不凡。

2.1.1 執行單一指令

以普通使用者身分登入後,您可以在指令前加上 sudoroot 身分執行任何指令。系統會提示使用者輸入 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 開頭的指令會以更高權限執行。如果在不使用字首 sudo 的情況下執行同樣的指令,系統會繼續以目前使用者的權限執行。

4

在限定時間內,您無需再次輸入 root 密碼。

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

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

只有 echo/cat 二進位值會以更高權限執行,重新導向會由使用者的外圍程序以使用者自己的權限來執行。若要啟動外圍程序,可依第 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 -i
root's password:
root:/home/tux # exit
tux:~ > 
sudo -i (<指令>)

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

tux:~ > sudo -i
root's password:
root:~ # exit
tux:~ > 

2.1.3 環境變數

sudo 依預設不會傳播環境變數︰

tux > ENVVAR=test env | grep ENVVAR
ENVVAR=test
tux > ENVVAR=test sudo env | grep ENVVAR
root's password:
1
tux > 

1

輸出為空即說明在使用 sudo 執行的指令的網路位置中不存在環境變數 ENVVAR

使用 env_reset 選項會導致行為出現變更,請參閱表格 2.1 「有用的旗標和選項」

2.2 設定 sudo

sudo 是一項非常靈活的工具,提供大量組態。

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

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

2.2.1 編輯組態檔案

sudo 的主要規則組態檔案為 /etc/sudoers。如果此檔案中存在錯誤,您可能便無法進入系統,因此強烈建議您使用 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 指令 (用於 /etc/sudoers.d) 會忽略以 ~ (波狀符號) 結尾或包含 . (點).

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

2.2.2 sudoers 組態的基本語法

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

# Everything on a line after a # gets 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 這兩個一般指令例外。其後是數字,用於指定 UID。

2

移除 ! 可將指定的旗標設定為開啟。

3

請參閱第 2.2.3 節 「sudoers 中的規則」

表 2.1︰ 有用的旗標和選項

選項名稱

描述

範例

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 中的規則

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 位址。否定運算可以使用 ! 字首。ALLHost_List 的一般選項。

NOPASSWD:|PASSWD:

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

PASSWD 為預設值,只有當其與 NOPASSWD 出現在同一行時才需要指定︰

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 ""
警告
警告:可造成嚴重後果的建構

下列類型的建構

ALL ALL = ALL

在沒有 Defaults targetpw 的情況下切勿使用,否則任何人都能以 root 身分執行指令。

2.3 常見使用案例

雖然預設組態對於簡單設定和桌面環境往往已足夠,但自訂組態也非常有用。

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

在具有特殊限制 (使用者 X 只能以 root 身分執行指令 Y) 的情況下,這點無法實現。在其他情況下,還是建議進行某類分隔。依慣例,wheel 群組的成員可以以 root 身分執行所有帶有 sudo 的指令。

  1. 將自己新增至 wheel 群組

    如果您的使用者帳戶尚不是 wheel 群組的成員,可執行 sudo usermod -a -G wheel 使用者名稱,然後登出並再次登入,將帳戶加入其中。執行 groups 使用者名稱驗證變更是否成功。

  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

YaST 將選擇 ncurses 介面而非圖形介面。

若要在 sudo 啟動的應用程式中使用 X.Org,需要傳播環境變數 DISPLAYXAUTHORITY。若要對此進行設定,請建立檔案 /etc/sudoers.d/xorg (請參閱第 2.2.1 節 「編輯組態檔案」) 並新增下列一行︰

Defaults env_keep += "DISPLAY XAUTHORITY"

若尚未設定 XAUTHORITY 變數,請依如下方式設定︰

export XAUTHORITY=~/.Xauthority

現在,X.Org 應用程式便可正常執行︰

sudo yast2

2.4 更多資訊

使用 sudo --help 可取得有關可用的指令行參數的簡要綜覽。說明和其他重要資訊可參閱 man 頁面 man 8 sudo,組態則記錄在 man 5 sudoers 中。