Are you an LLM? You can read better optimized documentation at /tw/fe/linux/file-permission.md for this page in Markdown format
Linux 文件權限管理 | chmod、chown 命令完全解析與最佳實踐
Linux 操作系統中對權限的管理很嚴格。Linux 系統中不僅是對用戶與組根據 UID,GID 進行了管理,還對 Linux 系統中的文件,按照用戶與組進行分類,針對不同的群體進行了權限管理,用他來確定誰能通過何種方式和目錄進行訪問和操作。
理解並正確配置文件權限是 Linux 系統安全的基石。本文將全面解析 Linux 權限系統的工作原理和實際應用。
Linux 的文件權限詳解
權限共有 10 個字符,我們將它分為 4 大部分來理解:
表示文件的類型
- | 表示是一個文件 |
|---|---|
d | 表示是一個目錄 |
l | 表示是一個連接(理解為快捷方式) |
c | 字符設備文件 |
b | 塊設備文件 |
s | socket 文件 |
p | 命名管道文件 |
用戶組類型
| 縮寫 | 用戶組 | 類型 |
|---|---|---|
u | owner | 屬主 :當前用戶具有的對該文件的權限 |
g | group | 當前組內其他用戶具有對該文件的權限 |
o | other | 其他組的用戶具有的對該文件的權限 |
a | all | 所有用戶(u+g+o) |
權限類型
r:Read讀w:Write寫x:execute執行-:無權限
針對目錄加執行權限,文件不加執行權限(因文件具備執行權限有安全隱患)
針對文件和目錄來說,r,w,x 有著不同的作用和含義
| 命令 | 針對文件 | 針對目錄 |
|---|---|---|
r | 讀取文件內容 | 查看目錄下的文件列表 |
w | 修改文件內容 | 刪除和創建目錄下的文件 |
x | 執行權限對除二進制程序以外的文件沒什麼意義 | 可以 cd 進入目錄,能查看目錄中文件的詳細屬性,能訪問目錄下文件內容(基礎權限) |
TIP
root 賬戶不受文件權限的讀寫限制,執行權限受限制
權限位完整解析
bash
# 查看文件權限
ls -l filename
# 示例輸出
-rwxr-xr-- 1 user group 1024 Jan 15 10:30 script.sh
^ ^^^ ^^^ ^^^
| | | |
| | | └─ 其他用戶權限 (r--)
| | └───── 組權限 (r-x)
| └───────── 所有者權限 (rwx)
└─────────── 文件類型 (-)| 權限項 | 文件類型 | 讀 | 寫 | 執行 | 讀 | 寫 | 執行 | 讀 | 寫 |
| 字符表示 | (d|l|c|s|p) | (r) | (w) | (x) | (r) | (w) | (x) | (r) | (w) |
| 數字表示 | 4 | 2 | 1 | 4 | 2 | 1 | 4 | 2 | |
| 權限分配 | 文件所有者 | 文件所屬組用戶 | 其他用戶 |
用戶獲取文件權限的順序:先看是否為所有者,如果是,則後面權限不看;再看是否為所屬組,如果是,則後面權限不看。
權限的數字表示法
權限值計算
每個權限都有對應的數值:
r(讀) = 4w(寫) = 2x(執行) = 1-(無) = 0
常見權限組合
| 權限字符串 | 計算方式 | 八進制值 | 說明 |
|---|---|---|---|
rwx | 4+2+1 | 7 | 完全控制 |
rw- | 4+2+0 | 6 | 讀寫 |
r-x | 4+0+1 | 5 | 讀執行 |
r-- | 4+0+0 | 4 | 只讀 |
-wx | 0+2+1 | 3 | 寫執行 |
-w- | 0+2+0 | 2 | 只寫 |
--x | 0+0+1 | 1 | 只執行 |
--- | 0+0+0 | 0 | 無權限 |
三位權限碼示例
bash
# 755 = rwxr-xr-x
chmod 755 script.sh
# 所有者:rwx (7)
# 組:r-x (5)
# 其他:r-x (5)
# 644 = rw-r--r--
chmod 644 file.txt
# 所有者:rw- (6)
# 組:r-- (4)
# 其他:r-- (4)
# 600 = rw-------
chmod 600 private.key
# 所有者:rw- (6)
# 組:--- (0)
# 其他:--- (0)修改文件權限
chown 是 change owner 的意思,主要作用就是改變文件或者目錄所有者。
chmod | 修改文件和文件夾讀寫執行屬性。使用權限:所有使用者 |
|---|---|
chown | 修改文件和文件夾的用戶和用戶組屬性。使用權限:root |
chmod 命令詳解
mode 方式(符號模式)
bash
chmod who opt per filewho | u g o a(all) (u 用戶 user,g 用戶組 group,o 其他用戶,a 所有用戶默認) |
|---|---|
opt | + 添加某個權限 - 取消某個權限 = 賦予權限 |
per | r w x X |
示例:
bash
chmod u=rwx,g=r a.txt
chmod u+x,g+w,o+w test.log #r 讀,w 寫, x 執行
# 更多示例
chmod +x script.sh # 所有人添加執行權限
chmod u-w file.txt # 移除所有者寫權限
chmod go=r file.txt # 組和其他用戶設為只讀
chmod a+x program # 所有人添加執行權限數字方式設置權限
命令語法
使用數字方式修改文件權限的基本語法如下:
bash
chmod xxx file其中 xxx 是一個三位數,分別表示用戶、用戶組、其他用戶的權限。
權限對應關係表
| 權限 | 數字值 | 權限總和 |
|---|---|---|
rwx | 421 | 7 |
rw- | 420 | 6 |
r-- | 400 | 4 |
0表示無權限1表示執行權限(x)2表示寫權限(w)4表示讀權限(r)
權限示例
bash
-rwxr--r-- 1 root root 10 oct 16 02:55 yhp.log| 權限類別 | 權限字符串 | 數值拆解 | 權限總和 |
|---|---|---|---|
| 用戶權限 | rwx | 4+2+1 | 7 |
| 用戶組權限 | r-- | 4+0+0 | 4 |
| 其他用戶權限 | r-- | 4+0+0 | 4 |
權限組合示例:744
代表用戶擁有讀、寫、執行權限,組和其他用戶只有讀權限。
chown 命令詳解
基本語法
bash
chown [選項]... [所有者][:[組]] 文件...常用用法
bash
# 修改文件所有者
chown user file.txt
# 修改所有者和組
chown user:group file.txt
# 僅修改組
chown :group file.txt
# 或
chgrp group file.txt
# 遞歸修改目錄
chown -R user:group directory/
# 參考其他文件的權限
chown --reference=ref_file target_file實際應用場景
bash
# 1. Web 服務器文件權限
sudo chown -R www-data:www-data /var/www/html
sudo chmod -R 755 /var/www/html
# 2. SSH 密鑰權限
chmod 700 ~/.ssh
chmod 600 ~/.ssh/id_rsa
chmod 644 ~/.ssh/id_rsa.pub
chmod 644 ~/.ssh/authorized_keys
# 3. 腳本文件權限
chmod 755 deploy.sh
chown deployer:deployers deploy.sh
# 4. 數據庫文件權限
chown mysql:mysql /var/lib/mysql
chmod 750 /var/lib/mysql修改權限示例
以下操作展示如何修改文件權限:
- 所有人都加入寫入權限(+2)
- 給用戶組加入寫入權限(+2)
- 給其他用戶加入執行權限(+1)
權限組合結果:765
bash
chmod 765 a.txt權限修改實戰案例
bash
# 案例 1:創建安全的私鑰文件
touch private.key
chmod 600 private.key
# 結果:-rw------- (只有所有者可讀寫)
# 案例 2:設置共享目錄
mkdir shared_folder
chmod 775 shared_folder
chown :developers shared_folder
# 結果:drwxrwxr-x (組成員可讀寫執行)
# 案例 3:Web 應用權限
find /var/www/app -type f -exec chmod 644 {} \;
find /var/www/app -type d -exec chmod 755 {} \;
chmod 600 /var/www/app/config/database.yml
# 案例 4:批量修改權限
# 將所有 .sh 文件設為可執行
find . -name "*.sh" -exec chmod +x {} \;
# 將所有配置文件設為只讀
find /etc/myapp -name "*.conf" -exec chmod 644 {} \;特殊權限位
除了基本的 rwx 權限,Linux 還有三個特殊權限位:
SUID (Set User ID) - 4000
bash
# 設置 SUID
chmod u+s executable
chmod 4755 executable
# 效果:運行該文件時,以文件所有者的權限執行
# 常見於:passwd, sudo 等命令
ls -l /usr/bin/passwd
# -rwsr-xr-x 1 root root ...
# ^ SUID 位SGID (Set Group ID) - 2000
bash
# 設置 SGID
chmod g+s directory
chmod 2775 directory
# 效果:
# - 對文件:以文件所屬組權限執行
# - 對目錄:新創建的文件繼承目錄的組
# 應用場景:共享協作目錄
mkdir /shared/project
chmod 2775 /shared/project
chown :developers /shared/projectSticky Bit - 1000
bash
# 設置粘滯位
chmod +t directory
chmod 1777 directory
# 效果:目錄中的文件只能被所有者刪除
# 常見於:/tmp 目錄
ls -ld /tmp
# drwxrwxrwt ...
# ^ Sticky bit特殊權限組合示例
bash
# 同時設置多個特殊權限
chmod 6755 script.sh
# SUID (4) + SGID (2) + rwxr-xr-x (755)
# 查看特殊權限
stat filename
ls -l filename高級權限管理技巧
1. umask - 默認權限掩碼
bash
# 查看當前 umask
umask
# 輸出:0022
# 計算默認權限
# 文件:666 - 022 = 644 (rw-r--r--)
# 目錄:777 - 022 = 755 (rwxr-xr-x)
# 臨時修改 umask
umask 027
# 文件:666 - 027 = 640 (rw-r-----)
# 目錄:777 - 027 = 750 (rwxr-x---)
# 永久修改(添加到 ~/.bashrc)
echo "umask 027" >> ~/.bashrc2. ACL (Access Control Lists)
bash
# 查看 ACL
getfacl file.txt
# 設置 ACL
setfacl -m u:username:rwx file.txt
setfacl -m g:groupname:rx file.txt
# 刪除 ACL
setfacl -x u:username file.txt
# 遞歸設置 ACL
setfacl -R -m u:username:rwx directory/3. 權限審計
bash
# 查找 SUID 文件
find / -perm -4000 -type f 2>/dev/null
# 查找 SGID 文件
find / -perm -2000 -type f 2>/dev/null
# 查找世界可寫文件
find / -perm -0002 -type f 2>/dev/null
# 查找無主文件
find / -nouser -o -nogroup 2>/dev/null權限安全最佳實踐
1. 最小權限原則
bash
# ❌ 不安全:所有人可寫
chmod 777 important_file
# ✅ 安全:僅所有者可讀寫
chmod 600 important_file
# ✅ 適中:所有者讀寫,組只讀
chmod 640 important_file2. 敏感文件保護
bash
# SSH 密鑰
chmod 700 ~/.ssh
chmod 600 ~/.ssh/*
chmod 644 ~/.ssh/*.pub
# GPG 密鑰
chmod 700 ~/.gnupg
chmod 600 ~/.gnupg/*
# 密碼文件
chmod 600 .env
chmod 600 config/secrets.yml3. Web 服務器權限
bash
# Nginx/Apache 推薦權限
chown -R www-data:www-data /var/www
find /var/www -type d -exec chmod 755 {} \;
find /var/www -type f -exec chmod 644 {} \;
# 上傳目錄特殊處理
chmod 775 /var/www/uploads
chown www-data:www-data /var/www/uploads4. 定期權限檢查
bash
#!/bin/bash
# permission_audit.sh
echo "=== SUID Files ==="
find / -perm -4000 -type f 2>/dev/null
echo -e "\n=== World-Writable Files ==="
find / -perm -0002 -type f 2>/dev/null
echo -e "\n=== Unowned Files ==="
find / -nouser -o -nogroup 2>/dev/null
echo -e "\nAudit complete!"常見問題排查
問題 1:Permission denied
bash
# 錯誤:Permission denied
# 診斷步驟
ls -l file.txt # 檢查權限
whoami # 確認當前用戶
groups # 查看用戶組
# 解決方案
sudo chmod +r file.txt # 添加讀權限
sudo chown $USER file.txt # 更改所有者問題 2:無法執行腳本
bash
# 錯誤:Permission denied
# 檢查執行權限
ls -l script.sh
# -rw-r--r-- (缺少 x 權限)
# 添加執行權限
chmod +x script.sh
# 或
chmod 755 script.sh問題 3:目錄無法進入
bash
# 錯誤:cd: permission denied: directory
# 目錄需要執行權限才能進入
ls -ld directory
# drwxr-x--- (如果用戶不在組中,無法進入)
# 解決方案
chmod o+x directory # 添加其他人執行權限
# 或
usermod -a -G groupname username # 將用戶加入組問題 4:權限遞歸問題
bash
# 遞歸修改時保留特殊權限
chmod -R u+rwX,go+rX,go-w directory/
# X (大寫) 只對目錄和已有執行權限的文件生效總結
Linux 文件權限系統是系統安全的核心:
- 理解權限模型:用戶、組、其他用戶三層權限
- 掌握兩種表示法:符號模式和數字模式
- 善用特殊權限:SUID、SGID、Sticky Bit
- 遵循最小權限原則:只授予必要的權限
- 定期審計:檢查異常權限設置
關鍵命令速查:
bash
chmod 755 file # 設置權限
chown user:group file # 更改所有者
ls -l # 查看權限
umask 022 # 設置默認權限掩碼
getfacl file # 查看 ACL下一步學習:
掌握權限管理,讓你的 Linux 系統更安全!🔒