Sudo

出自 Arch Linux 中文维基

Sudo(substitute user do) 使得系統管理員可以授權特定用户或用户組作為 root 或他用户執行某些(或所有)命令,同時還能夠對命令及其參數提供審核跟蹤。

用户可以選擇用 su 切換到 root 用户運行命令,但是這種方式會啟動一個 root shell 並允許用户運行之後的所有的命令。而 sudo 可以針對單個命令、僅在需要時授予臨時權限,減少因為執行錯誤命令損壞系統的可能性。sudo 也能以其他用户身份執行命令並且記錄用户執行的命令,以及失敗的權限申請。

安裝[編輯 | 編輯原始碼]

安裝 sudo 軟件包。

使用[編輯 | 編輯原始碼]

在正確配置之前,普通用户無法使用 sudo。參見#配置

要使用 sudo,只需在命令和其參數前加上 sudo 和空格:

$ sudo cmd

例如,要使用 pacman:

$ sudo pacman -Syu

參見 sudo(8)

配置[編輯 | 編輯原始碼]

有關配置和密碼過期等問題的更多信息,請閱讀 man sudoers

查看當前設置[編輯 | 編輯原始碼]

命令 sudo -ll 可以顯示當前的 sudo 配置; 命令 sudo -lU user 可以查看某個特定用户的設置。

使用 visudo[編輯 | 編輯原始碼]

sudo的配置文件是/etc/sudoersvisudo會鎖住sudoers文件,保存修改到臨時文件,然後檢查文件格式,確保正確後才會覆蓋sudoers文件。必須保證sudoers格式正確,否則sudo將無法運行。

警吿: /etc/sudoers格式錯誤會導致sudo不可用。必須使用visudo編輯該文件防止出錯。

visudo調用的默認編輯器是vi。官方倉庫裡的 sudo 編譯時開啟了--with-env-editor,會採用環境變量 VISUALEDITOR的設置。如果設置了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
警吿: 任何以您的用户名運行的程序都可以無需密碼就執行 sudo。

只為用户啟用部分命令的執行權限:

用户名 主机名=/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分鐘。時間值也可以是小數。

提示:如果timestamp_timeout設置為0,sudo總是詢問密碼。

使用技巧[編輯 | 編輯原始碼]

bash 自動補全支持[編輯 | 編輯原始碼]

詳情參見:bash#自定義命令補全

跨終端sudo[編輯 | 編輯原始碼]

警吿: 此舉使得所有進程都使用同一個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詢問用户密碼。添加targetpwrootpw到配置文件的「Defaults」部分,可以讓sudo詢問root密碼:

Defaults targetpw

可以限定特定的組使用 root 密碼:

Defaults:%wheel targetpw
%wheel ALL=(ALL) ALL

禁止root登錄[編輯 | 編輯原始碼]

警吿: ArchLinux用户最好不要禁用root用户,出問題就麻煩大了。

有了sudo,用户也許希望禁止使用root登錄。沒有了root用户,黑客就不知道管理員賬户的名字了。

警吿: 務必在禁用root之前配置好其他用户的權限!

使用passwd命令鎖住root用户:

# passwd -l root

下列命令解鎖root用户:

$ sudo passwd -u root

或者,編輯/etc/shadow文件,將root的加密口令列替換為「!」:

root:!:12345::::::

要再次啟用sudo,重新設置其密碼即可:

$ sudo passwd root
提示:要在禁用 root 賬號後使用交互 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,請注意配置文件的順序以避免相互覆蓋。

+

警吿: The files in /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 -esudoedit 可以實現用其它用户編輯文件,但是文件編輯器本身還是以當前用户運行。

這樣可以不以 root 用户運行程序,但是保存時具有 root 權限,詳情參考 sudo(8) § e.

可以用 meld 管理 pacnew 文件:

$ 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 文件[編輯 | 編輯原始碼]

此頁面 列出了所有可用配置。