sudo (SuperUser DO) 允許授權用戶以另一個用戶 (默認 root) 的身份執行命令,並在執行前要求輸入當前用戶自己的密碼 (而非 root 密碼)。它是 Linux/Unix 系統管理的核心工具,實現最小權限原則:日常操作用普通用戶,僅在需要提權時臨時獲取 root 權限,操作結束自動歸還。
| 特性 | su (Switch User) | sudo |
|---|---|---|
| 密碼 | 目標用戶密碼 (通常是 root) | 當前用戶自身密碼 |
| 權限範圍 | 切換後擁有目標用戶全部權限 | 可精確控制允許執行的具體命令 |
| 審計日誌 | 無內建日誌 | 自動記錄誰、何時、執行什麼命令 (通常在 /var/log/auth.log 或 /var/log/secure) |
| 票據機制 | 無 | 時間戳票據 (默認 5-15 分鐘免密再次提權) |
| 環境變量 | su - 會載入目標用戶環境 | 默認重置環境 (可用 -E 保留) |
| 安全性 | root 密碼洩露 = 全系統淪陷 | 無需共享 root 密碼、可撤銷單用戶權限 |
# 正確編輯方式
sudo visudo
# 或指定編輯器
EDITOR=vim sudo visudo
visudo 會:鎖定文件防衝突 → 以 root 權限啟動編輯器 → 保存前語法檢查 (防止語法錯誤導致無法 sudo) → 解鎖。
用戶/組 主機=(目標用戶) 命令列表
# 例子
zhangsan ALL=(ALL) ALL # zhangsan 可在任何主機以任何用戶身份執行任何命令
%wheel ALL=(ALL) ALL # wheel 組用戶享有完整 sudo 權限 (CentOS/RHEL/Fedora 默認)
devops ALL=(ALL) NOPASSWD: /usr/bin/docker, /usr/bin/kubectl # 免密執行特定命令
backup ALL=(root) /usr/bin/rsync, /bin/tar # 僅以 root 身份執行備份命令
User_Alias ADMINS = zhangsan, lisi, wangwu
Cmnd_Alias NETWORK = /sbin/ifconfig, /sbin/ip, /bin/ss, /usr/bin/nmcli
Cmnd_Alias STORAGE = /bin/mount, /bin/umount, /sbin/fdisk, /sbin/mkfs
ADMINS ALL = (root) NETWORK, STORAGE
/var/run/sudo/ts/用戶名 (或 /var/db/sudo) 建立時間戳文件。| 參數 | 全寫 | 作用 | 典型場景 |
|---|---|---|---|
-h | --help | 顯示幫助並退出 | 快速查閱參數 |
-V | --version | 顯示版本信息並退出 | 確認 sudo 版本/功能支援 |
-l | --list | 列出當前用戶可執行的 sudo 命令 | 審計自身權限 |
-u user | --user=user | 以指定用戶身份執行 (而非 root) | sudo -u postgres psql 以 postgres 用戶進資料庫 |
-g group | --group=group | 以指定組身份執行 | 較少用 |
-k | --reset-timestamp | 使時間戳失效 (下次需輸密) | 離開終端前手動清除票據 |
-K | --remove-timestamp | 徹底刪除時間戳文件 | 強制下次必須輸密 |
-b | --background | 在後台執行命令 (不佔用終端) | sudo -b updatedb & 後台更新 locate 資料庫 |
-s | --shell | 啟動 root Shell (環境變量保留當前用戶) | 需要連續執行多條 root 命令 |
-i | --login | 啟動 root 登錄 Shell (載入 root 環境變量、進入 /root) | 完整模擬 root 登錄,**推薦替代 su** |
-E | --preserve-env | 保留當前環境變量 (需 sudoers `Defaults env_keep` 配合) | 傳遞 HTTP_PROXY、PATH 等變量 |
-p "prompt" | --prompt | 自定義密碼提示符 (%u=用戶 %h=主機) | sudo -p "[%u@%h] 請輸入密碼: " |
-e file | --edit | 以 root 權限編輯文件 (等同 sudoedit),不直接運行命令 | 安全編輯敏感配置 sudo -e /etc/nginx/nginx.conf |
/var/log/secure / /var/log/auth.log 中的 `sudo:` 記錄,或配置 syslog 發送至集中日誌平台 (ELK/Splunk/Graylog)。pam_google_authenticator.so 或 duo 為 sudo 添加 TOTP/推送驗證。visudo 添加或 usermod -aG wheel username。pkexec visudo (若 polkit 允許)。sudo -S 從 stdin 讀密、或設置 `Defaults visiblepw` (不推薦)。sudo 是 Linux 系統管理的基石。掌握 visudo 安全編輯、理解票據機制、善用 -u/-i/-b/-k 等參數、遵循最小權限與審計原則,能讓你在享受提權便利的同時,將風險降至最低。記住:**能用 sudo 就別用 su,能用普通用戶就別用 root。**