萬盛學電腦網

您现在的位置: 萬盛學電腦網 >> 作業系統 >  >> Linux 教學

Linux chmod 權限管理完全指南:符號模式與八進制模式雙軌並行、遞歸操作與特殊位實戰

chmod (Change Mode) 是 Linux 權限管理的核心命令。掌握符號模式(直觀語義)與八進制模式(高效精確)雙軌操作,並理解 setuid/setgid/sticky 三大特殊權限位,是系統管理員的必修課。本文提供完整語法參考、實戰場景對比、遞歸陷阱避坑與自動化腳本模板。

一、權限模型速覽

主體符號八進制位權限含義
用戶/擁有者u第 1 位 (64)r=4, w=2, x=1
組g第 2 位 (8)r=4, w=2, x=1
其他o第 3 位 (1)r=4, w=2, x=1
所有a—u+g+o 合集

特殊權限位(第 0 位,高位)

名稱八進制符號文件效果目錄效果
SetUID4000u+s執行時獲得文件擁有者權限—
SetGID2000g+s執行時獲得文件組權限新建文件繼承目錄組
Sticky1000o+t—僅擁有者/root可刪除文件(/tmp)

二、符號模式(語義化、增量修改)

語法:chmod [ugoa...][+-=][rwxXst...] file...

操作符含義
+添加權限
-移除權限
=精確設置(清除原有)

實戰範例

# 1. 所有用戶加讀寫執行
chmod a+rwx file
chmod ugo+rwx file  # 等效

# 2. 去除其他用戶寫權限
chmod o-w file

# 3. 設置用戶/組讀寫執行,其他唯讀
chmod u=rwx,g=rwx,o=r file

# 4. 遞歸:目錄加 x,文件不加 x (大 X 技巧)
chmod -R u+rwX,go+rX,go-w /path/to/dir
# X: 僅當是目錄或已有 x 時添加 x

# 5. 特殊位設置
chmod u+s /usr/bin/myapp      # SetUID
chmod g+s /shared/team        # SetGID (團隊協作目錄)
chmod o+t /tmp                # Sticky bit

權限數字對應表

三、八進制模式(精確、全量設置)

算法:r=4, w=2, x=1,三組相加

rwx = 4+2+1 = 7
rw- = 4+2+0 = 6
r-x = 4+0+1 = 5
r-- = 4+0+0 = 4

常用組合速查

場景八進制符號等效ls -l 顯示
私有文件600u=rw,go=-rw-------
腳本/執行文件700u=rwx,go=-rwx------
共享文件(組可寫)660u=rw,g=rw,o=-rw-rw----
Web 目錄755u=rwx,g=rx,o=rxdrwxr-xr-x
團隊協作目錄2775u=rwx,g=rwx,o=rx + g+sdrwxrwsr-x
公共臨時目錄1777a=rwx + o+tdrwxrwxrwt
SetUID 程序4755u=rxs,g=rx,o=rx-rwsr-xr-x

實戰範例

# 等效於 chmod a+rwx
chmod 777 file

# 僅擁有者全權,組讀執行,其他讀執行
chmod 755 script.sh

# 含特殊位:SetGID 目錄
chmod 2775 /shared/team

八進制權限計算表

四、遞歸操作陷阱與最佳實踐

❌ 危險操作

chmod -R 777 /var/www   # 災難:所有文件變可執行,安全風險極大
chmod -R 644 /var/www   # 災難:目錄失去 x,無法遍歷,網站掛掉

✅ 正確做法:區分文件與目錄

# 方法 1:find + xargs (標準、可控)
find /var/www -type d -exec chmod 755 {} +
find /var/www -type f -exec chmod 644 {} +

# 方法 2:chmod 大 X 技巧 (僅 GNU coreutils)
chmod -R u+rwX,go+rX,go-w /var/www
# 大 X: 如果是目錄或已有任意 x 權限,則添加 x

# 方法 3:配合 setgid 保持組所有權
find /shared/team -type d -exec chmod 2775 {} +
find /shared/team -type f -exec chmod 664 {} +

五、參考模式 --reference 與批量同步

# 以 reference_file 的權限為準
chmod --reference=reference_file target_file

# 批量同步某目錄權限到另一目錄 (結構相同)
cd /src && find . -type f -printf "chmod %m %p\n" | sed 's|^\./|/dst/|' | sh

六、查看權限數值

stat -c "%a %n" file          # 八進制權限 + 文件名
stat -c "%A %a %n" file       # 符號權限 + 八進制 + 文件名
ls -l file                    # 傳統輸出

七、自動化修腳本模板

#!/bin/bash
# fix-perms.sh: 標準化 Web 目錄權限
# 用法: fix-perms.sh /var/www/html

TARGET="${1:-.}"
OWNER="${2:-www-data:www-data}"

echo "Fixing ownership..."
chown -R "$OWNER" "$TARGET"

echo "Fixing directory permissions (2775)..."
find "$TARGET" -type d -exec chmod 2775 {} +

echo "Fixing file permissions (664)..."
find "$TARGET" -type f -exec chmod 664 {} +

echo "Fixing script/executable permissions (755)..."
find "$TARGET" -type f -name "*.sh" -exec chmod 755 {} +
find "$TARGET" -type f -name "*.py" -exec chmod 755 {} +

echo "Done."

核心心法: 符號模式適合「微調」(加/減某權限),八進制適合「定型」(標準化部署)。遞歸操作必須區分文件與目錄,善用 find -type d/f 或 chmod 大 X。特殊位是雙刃劍:SetGID 利於協作,SetUID 極度危險(提權漏洞源頭),非必要不開啟。

copyright © 萬盛學電腦網 all rights reserved