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

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