Sudo
Sudo(substitute user do) 使得系統管理員可以授權特定用戶或用戶組作為 root 或他用戶執行某些(或所有)命令,同時還能夠對命令及其參數提供審核跟蹤。
用戶可以選擇用 su 切換到 root 用戶運行命令,但是這種方式會啟動一個 root shell 並允許用戶運行之後的所有的命令。而 sudo 可以針對單個命令、僅在需要時授予臨時權限,減少因為執行錯誤命令損壞系統的可能性。sudo 也能以其他用戶身份執行命令並且記錄用戶執行的命令,以及失敗的權限申請。
安裝[編輯 | 編輯原始碼]
使用[編輯 | 編輯原始碼]
在正確配置之前,普通用戶無法使用 sudo
。參見#配置。
要使用 sudo,只需在命令和其參數前加上 sudo
和空格:
$ sudo cmd
例如,要使用 pacman:
$ sudo pacman -Syu
參見 sudo(8)。
配置[編輯 | 編輯原始碼]
有關配置和密碼過期等問題的更多信息,請閱讀 man sudoers。
查看當前設置[編輯 | 編輯原始碼]
命令 sudo -ll
可以顯示當前的 sudo 配置; 命令 sudo -lU user
可以查看某個特定用戶的設置。
使用 visudo[編輯 | 編輯原始碼]
sudo的配置文件是/etc/sudoers
。visudo
會鎖住sudoers
文件,保存修改到臨時文件,然後檢查文件格式,確保正確後才會覆蓋sudoers
文件。必須保證sudoers
格式正確,否則sudo將無法運行。
/etc/sudoers
格式錯誤會導致sudo不可用。必須使用visudo
編輯該文件防止出錯。visudo
調用的默認編輯器是vi
。官方倉庫裡的 sudo 編譯時開啟了--with-env-editor
,會採用環境變量 VISUAL
和 EDITOR
的設置。如果設置了VISUAL
就不會使用EDITOR
。
如果要臨時使用其他編輯器,在該命令前加上EDITOR
環境變量即可。例如,要使用 nano
,用root運行以下命令:
# EDITOR=nano visudo
要永久設置編輯器,請查看定義本地環境變量.
系統級的設置可以把編輯器設置到 /etc/sudoers
。以 nano
為例,使用visudo
打開該文件,加入以下內容:
# Defaults specification # Reset environment by default Defaults env_reset # Set default EDITOR to vim, and do not allow visudo to use EDITOR/VISUAL. Defaults editor=/usr/bin/nano, !env_editor
設置示例[編輯 | 編輯原始碼]
要為某個用戶可以執行所有命令,在配置文件中加入:
用户名 ALL=(ALL) ALL
如果只想允許以某個主機名登錄用戶執行命令:
用户名 主机名=(ALL) ALL
允許wheel用戶組成員無密碼使用sudo:
%wheel ALL=(ALL) NOPASSWD: ALL
要不詢問某個用戶的密碼:
Defaults:USER_NAME !authenticate
只為用戶啟用部分命令的執行權限:
用户名 主机名=/sbin/halt,/sbin/poweroff,/sbin/reboot,/usr/bin/pacman -Syu
只為某個主機名登錄用戶啟用部分命令的執行權限,不用輸入密碼:
USER_NAME HOST_NAME= NOPASSWD: /usr/bin/halt,/usr/bin/poweroff,/usr/bin/reboot,/usr/bin/pacman -Syu
更詳細的sudoers
範例,參見本頁。此外,更多信息參見:sudoers 手冊。
sudoers文件默認權限[編輯 | 編輯原始碼]
sudoers文件的屬主和屬組ID必須都是0,文件權限位是0440(-r--r-----)。如果你不小心改變了默認權限,應當立即恢復它們:
# chown -c root:root /etc/sudoers # chmod -c 0440 /etc/sudoers
密碼過期時間[編輯 | 編輯原始碼]
用戶可以修改sudo記錄密碼的時間。使用visudo
命令將如下內容加入/etc/sudoers
:
Defaults:用户名 timestamp_timeout=20
對該用戶,sudo將記錄密碼20分鐘。時間值也可以是小數。
使用技巧[編輯 | 編輯原始碼]
bash 自動補全支持[編輯 | 編輯原始碼]
詳情參見:bash#自定義命令補全。
跨終端sudo[編輯 | 編輯原始碼]
如果不想每次啟動新終端都重新輸入密碼,在配置文件中禁止tty_tickets即可:
Defaults !tty_tickets
環境變量[編輯 | 編輯原始碼]
當前用戶的環境變量不會應用到sudo啟動的程序,除非使用-E
選項:
$ sudo -E pacman -Syu
如果經常需要這樣做,可以在~/.bashrc
(或其他shell配置文件)中加入命令別名:
alias sudo="sudo -E"
在/etc/sudoers
中添加以下內容作用相同:
Defaults !env_reset
可以把需要傳遞環境變量的命令設置到env_keep
:
Defaults env_keep += "ftp_proxy http_proxy https_proxy no_proxy"
傳遞命令別名[編輯 | 編輯原始碼]
當前用戶的命令別名不會應用到sudo。如果需要這樣,只需在~/.bashrc
或者/etc/bash.bashrc
中加入:
alias sudo='sudo '
使用root密碼[編輯 | 編輯原始碼]
默認sudo詢問用戶密碼。添加targetpw
或 rootpw
到配置文件的「Defaults」部分,可以讓sudo詢問root密碼:
Defaults targetpw
可以限定特定的組使用 root 密碼:
Defaults:%wheel targetpw %wheel ALL=(ALL) ALL
禁止root登錄[編輯 | 編輯原始碼]
有了sudo,用戶也許希望禁止使用root登錄。沒有了root用戶,黑客就不知道管理員帳戶的名字了。
使用passwd
命令鎖住root用戶:
# passwd -l root
下列命令解鎖root用戶:
$ sudo passwd -u root
或者,編輯/etc/shadow
文件,將root的加密口令列替換為「!」:
root:!:12345::::::
要再次啟用sudo,重新設置其密碼即可:
$ sudo passwd root
sudo -i
.kdesu[編輯 | 編輯原始碼]
KDE下常用 kdesu 以 root 權限執行圖形程序。默認情況下,即使root帳戶被禁用,kdesu仍會嘗試使用su切換root。需要配置kdesu以使用sudo,創建/編輯~/.config/kdesurc
,加入:
[super-user-command] super-user-command=sudo
或者使用下面命令:
$ kwriteconfig5 --file kdesurc --group super-user-command --key super-user-command sudo
讓 sudo 使用 /etc/sudoers.d 中的文件[編輯 | 編輯原始碼]
sudo 可以解析 /etc/sudoers.d/
目錄中的文件,這樣就不需要編輯單一的 /etc/sudoers
文件,可以單獨修改一個設置然後放入此目錄。目錄中配置的格式和 /etc/sudoers
一樣, 優點包括:
- 不需要編輯 {ic|sudoers.pacnew}} 文件;
- 如果新配置有問題,可以刪除這個文件而不用編輯
/etc/sudoers
.
/etc/sudoers.d/
目錄中的文件是按字母順序加載的,.
或 ~
開頭的文件會被跳過。文件名應該以雙字母開頭,例如 01_foo
,請注意配置文件的順序以避免相互覆蓋。
+
/etc/sudoers.d/
are just as fragile as /etc/sudoers
itself: any improperly formatted file will prevent sudo
from working. Hence, for the same reason it is strongly advised to use visudo
編輯文件[編輯 | 編輯原始碼]
sudo -e
或 sudoedit
可以實現用其它用戶編輯文件,但是文件編輯器本身還是以當前用戶運行。
這樣可以不以 root 用戶運行程序,但是保存時具有 root 權限,詳情參考 sudo(8) § e.
$ SUDO_EDITOR=meld sudo -e /etc/file{,.pacnew}
疑難解答[編輯 | 編輯原始碼]
SSH TTY 問題[編輯 | 編輯原始碼]
遠程執行命令時,SSH默認不會分配tty。沒有tty,sudo就無法在獲取密碼時關閉回顯。使用-tt
選項強制SSH分配tty。
另一方面,sudoers中的Defaults
選項requiretty
要求只有擁有tty的用戶才能使用sudo。可以通過visudo
編輯配置文件,禁用這個選項:
# Disable "ssh hostname sudo <cmd>", because it will show the password in clear text. # You have to run "ssh -t hostname sudo <cmd>". # # Defaults requiretty
權限 Umask[編輯 | 編輯原始碼]
Sudo 會統一用戶的 umask 值和它自己的 umask (默認是 0022)。這會阻止 sudo 創建比該用戶的 umask 允許的打開權限更多的文件。這默認是合理的,因為沒有使用自定義 umask。但是這可能導致用sudo運行一個命令和root運行一個命令建立的文件權限不同。如果這導致了問題,sudo 提供了一個方法來修復 umask,即使想要的 umask 比用戶指定的 umask 權限還要多。添加下面內容 (使用 visudo
) 會覆蓋 sudo 的默認行為:
Defaults umask = 0022 Defaults umask_override
這會將 sudo 的 umask 設置為 root 的默認 umask (0022),覆蓋掉默認行為,無論用戶的umask設置成什麼都會使用這裡設定的值。
默認 skeleton 文件[編輯 | 編輯原始碼]
此頁面列出了所有可用配置。