| 代碼 | 名稱 | 說明 |
|---|---|---|
u | User (Owner) | 文件創建者,擁有最高控制權 |
g | Group | 文件所屬組,組內成員共享組權限 |
o | Others | 除擁有者和組成員外的所有用戶 |
a | All | u+g+o 的簡寫,默認對象 |
| 字母 | 八進制 | 文件含義 | 目錄含義 |
|---|---|---|---|
r | 4 | 讀取內容 | 列出目錄條目 (ls) |
w | 2 | 修改內容 | 創建/刪除/重命名條目 |
x | 1 | 執行程序 | 進入目錄 (cd)、訪問條目元數據 |
| 名稱 | 字母 | 八進制 | 作用 | 典型場景 |
|---|---|---|---|---|
| SetUID | s (u+x 位顯示為 s) | 4000 | 執行時進程獲得文件擁有者權限 | /usr/bin/passwd (root 權限改密碼) |
| SetGID | s (g+x 位顯示為 s) | 2000 | 執行時進程獲得文件組權限;目錄下新文件繼承組 | 協作目錄 chmod g+s /shared |
| Sticky Bit | t (o+x 位顯示為 t) | 1000 | 只有文件擁有者/目錄擁有者/root 能刪除 | /tmp、/var/tmp |
-rwxr-xr-- 1 root root 1024 Jan 1 10:00 script.sh
│││││││││
│││││││└─ Others: r-- (4)
││││││└──── Others: -w- (0)
│││││└───── Others: --x (0)
││││├────── Group: r-x (5)
│││├─────── Group: -w- (0)
││└──────── Group: --x (1)
│├───────── User: rwx (7)
└────────── Type: - (文件) / d (目錄) / l (鏈接) / b/c (塊/字符設備)
chmod [ugoa...][+-=][rwxXst] 文件...
# 示例
chmod u+x script.sh # 擁有者加執行權
chmod go-w file.txt # 組和其他去寫權限
chmod a=r,ugo+x dir/ # 所有人讀+目錄可進入
chmod g+s /shared # 設置 SetGID
chmod +t /tmp # 設置 Sticky Bit
chmod u+s /usr/bin/myprog # 設置 SetUID (慎用!)
chmod 755 script.sh # u=rwx(7) g=rx(5) o=rx(5)
chmod 644 file.txt # u=rw(6) g=r(4) o=r(4)
chmod 750 /private # u=rwx g=rx o=---
chmod 4755 /usr/bin/su # SetUID(4) + 755
chmod 2755 /shared # SetGID(2) + 755
chmod 1777 /tmp # Sticky(1) + 777
chmod -R u+rwX,go=rX /path # 大 X: 只給目錄加 x,文件不加
chmod -R 644 /var/www/html # 文件 644,但目錄會失去 x 無法進入!
最佳實踐:目錄 755,文件 644,腳本/二進制 755。
chown [選項] [用戶][:組] 文件...
# 示例
chown alice file.txt # 改擁有者
chown alice:dev file.txt # 改擁有者和組
chown :dev file.txt # 只改組 (等同 chgrp)
chown -R alice:web /var/www # 遞歸
chown --reference=ref.txt target.txt # 參考文件屬性
-R:遞歸-v:顯示變更詳情-c:僅顯示已變更項--from=原用戶:原組:僅修改匹配項(安全)chgrp [選項] 組 文件...
chgrp dev file.txt
chgrp -R web /var/www/html
# 等同於 chown :dev file.txt
umask 是權限補碼,表示不授予的權限。
# 文件默認 666 (rw-rw-rw-),目錄默認 777 (rwxrwxrwx)
# 實際權限 = 默認權限 - umask (按位減,非數學減)
umask 022 # 文件 644 (rw-r--r--),目錄 755 (rwxr-xr-x) ← 最常用
umask 027 # 文件 640 (rw-r-----) ,目錄 750 (rwxr-x---) ← 組協作環境
umask 077 # 文件 600 (rw-------) ,目錄 700 (rwx------) ← 高安全
# 全局:/etc/profile 或 /etc/login.defs (UMASK 022)
# 用戶:~/.bashrc 或 ~/.profile
echo 'umask 022' >> ~/.bashrc
現代文件系統 (ext4/xfs/btrfs) 默認支持,掛載選項 acl(通常默認開啟)。
# 驗證
tune2fs -l /dev/sda1 | grep "Default mount options"
mount | grep acl
getfacl file.txt
# 輸出示例:
# file: file.txt
# owner: alice
# group: dev
user::rw-
user:bob:rwx # bob 額外擁有 rwx
group::r--
group:qa:r-x # qa 組額外擁有 r-x
mask::rwx # 有效權限上限
other::r--
# 給用戶授權
setfacl -m u:bob:rwx file.txt
# 給組授權
setfacl -m g:qa:rx file.txt
# 設置默認 ACL(目錄下新文件自動繼承)
setfacl -d -m u:bob:rwx /shared
setfacl -d -m g:qa:rx /shared
# 刪除特定 ACL
setfacl -x u:bob file.txt
# 刪除所有 ACL
setfacl -b file.txt
# 遞歸設置
setfacl -R -m u:bob:rwx /shared
chmod 修改會更新 ACL 的 mask,間接影響 ACL 生效權限getfacl 顯示的 mask 是實際生效上限getfacl -R /path > acl.bak,恢復:setfacl --restore=acl.bak| 屬性 | 字母 | 作用 | 適用對象 |
|---|---|---|---|
| 不可修改 | i | 不能刪除、重命名、寫入、鏈接;root 也需先移除屬性 | 文件/目錄 |
| 只能追加 | a | 只能在文件末尾追加,不能覆蓋/截斷 | 日志文件 |
| 同步更新 | S | 修改立即同步到磁盤 | 關鍵數據 |
| 不納入備份 | d | dump 忽略 | 臨時文件 |
| 壓縮 | c | 文件系統層面透明壓縮 (btrfs/zfs) | 大文件 |
# 設置
chattr +i /etc/passwd # 鎖定關鍵文件
chattr +a /var/log/messages # 日志只能追加
# 查看
lsattr /etc/passwd
# ----i---------e----- /etc/passwd
# 移除
chattr -i /etc/passwd
| 場景 | 命令序列 |
|---|---|
| Web 目錄部署 | chown -R www:www /var/www/html; find /var/www/html -type d -exec chmod 755 {} \;; find /var/www/html -type f -exec chmod 644 {} \; |
| 團隊協作目錄 | mkdir /shared; chgrp dev /shared; chmod 2775 /shared; setfacl -d -m g:dev:rwx /shared |
| 腳本可執行 | chmod 755 script.sh 或 chmod u+x script.sh |
| 保護關鍵配置 | chattr +i /etc/ssh/sshd_config |
| 臨時授權給用戶 | setfacl -m u:temp:rw /etc/nginx/nginx.conf |
| 遷移服務器權限同步 | getfacl -R /src > acl.bak; setfacl --restore=acl.bak (目標機) |
chmod g=rx file 會壓低 mask 導致 ACL 失效Linux 權限體系分層清晰:
運維鐵律:最小權限原則、避免 777、善用 ACL 替代寬鬆組權限、關鍵文件加 i 屬性。