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 執行單一指令 #
以普通使用者身分登入後,您可以在指令前加上 sudo
以 root
身分執行任何指令。系統會提示使用者輸入 root 密碼,一旦驗證成功,便會以 root
身分執行指令︰
tux >
id -un
1 tuxtux >
sudo id -un
root's password:2 roottux >
id -un
tux3tux >
sudo id -un
4 root
| |
輸入期間,密碼不會顯示 (既不顯示為純文字,也不顯示為項目符號)。 | |
只有以 | |
在限定時間內,您無需再次輸入 |
I/O 重新導向的工作方式與您的預期可能會有所不同︰
tux >
sudo echo s > /proc/sysrq-trigger bash: /proc/sysrq-trigger: Permission deniedtux >
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 #
exittux:~ >
sudo -i (<指令>)
與
-s
類似,但會將該外圍程序啟動為登入外圍程序。這表示系統會處理該外圍程式的啟動檔案 (.profile
等),並將目前的工作目錄設定為目標使用者的主目錄。tux:~ >
sudo -i root's password:root:~ #
exittux:~ >
2.1.3 環境變數 #
sudo
依預設不會傳播環境變數︰
tux >
ENVVAR=test env | grep ENVVAR ENVVAR=testtux >
ENVVAR=test sudo env | grep ENVVAR root's password: 1tux >
輸出為空即說明在使用 |
使用 env_reset
選項會導致行為出現變更,請參閱表格 2.1 「有用的旗標和選項」。
2.2 設定 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
| |
移除 | |
選項名稱 |
描述 |
範例 |
---|---|---|
targetpw
|
此旗標控制呼叫使用者是否需要輸入密碼。如果要求輸入目標使用者 (例如 |
Defaults targetpw # Turn targetpw flag ON |
rootpw
|
如果設定了此選項, |
Defaults !rootpw # Turn rootpw flag OFF |
env_reset
|
如果設定了此選項, |
Defaults env_reset # Turn env_reset flag ON |
env_keep
|
當 |
# 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
|
當 |
# 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
User_List
一或多個識別碼 (以
,
分隔)︰使用者名稱、以%GROUPNAME
格式表示的群組,或是以#UID
格式表示的使用者 ID。否定運算可以使用!
字首。Host_List
一或多個識別碼 (以
,
分隔)︰完全合格的主機名稱或 IP 位址。否定運算可以使用!
字首。ALL
是Host_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_List
、Host_List
和 Cmnd_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
的指令。
將自己新增至
wheel
群組如果您的使用者帳戶尚不是
wheel
群組的成員,可執行sudo usermod -a -G wheel 使用者名稱
,然後登出並再次登入,將帳戶加入其中。執行groups 使用者名稱
驗證變更是否成功。將使用呼叫使用者的密碼進行驗證的選項設定為預設設定。
使用
visudo
建立檔案/etc/sudoers.d/userpw
(請參閱第 2.2.1 節 「編輯組態檔案」) 並新增︰Defaults !targetpw
選取新的預設規則。
視您是否希望使用者重新輸入其密碼,在
/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
對預設規則設定更多限制
移除
/etc/sudoers
中的 allow-everything 規則或設定為備註︰ALL ALL=(ALL) ALL # WARNING! Only use this together with 'Defaults targetpw'!
警告:sudoers 中可造成嚴重後果的規則切勿遺忘此步驟,否則任何使用者都能以
root
身分執行任何指令!測試組態
嘗試以
wheel
成員身分和非成員身分執行sudo
。tux:~ >
groups users wheeltux:~ >
sudo id -un tux's password: rootwilber:~ >
groups userswilber:~ >
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,需要傳播環境變數 DISPLAY
和 XAUTHORITY
。若要對此進行設定,請建立檔案 /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
中。