目錄與檔案權限管理
Linux 是一個多使用者的系統,為了避免「菜鳥誤刪系統檔」或是「同事偷看薪資單」,Linux 擁有非常嚴密的權限控管機制。這一切都圍繞著兩個核心觀念:「身分 (UGO)」與「行為 (rwx)」。
1. 權限的三大身分 (UGO 基本概念)
每個檔案或目錄都有一組「擁有人與所屬群組」。當一個帳號想要碰這個檔案時,Linux 會根據 UGO 順序來判定他是誰:
- U (User / Owner):檔案的建立者,或者被指定為擁有者的人。
- G (Group):檔案所屬的群組。只要你隸屬於這個群組,你就擁有 G 的權限。
- O (Others):既不是擁有者,也不在群組內的所有其他路人。
💡 判定邏輯 (由上而下):系統會先看你是不是 U?是的話就套用 U 的權限並結束判定。不是的話再看你是不是 G 的成員?若是就套用 G。如果都不是,你就是 O。
2. 權限的三種行為 (rwx 權限)
針對上述的三種身分,我們可以分別賦予他們三種行為能力:
- r (read):可讀取。
- w (write):可寫入、修改。
- x (execute):可執行。
- - (沒有權限):如果那個位置是減號,代表沒有該項權限。
在 Windows 裡,系統是靠**「副檔名」**來決定檔案能不能執行(例如 .exe、.bat)。
但在 Linux 裡,副檔名毫無意義!決定一個檔案能不能被當作程式來跑的唯一標準,就是它有沒有被賦予 x 權限。
如果一個檔案沒有 x,它就只是一張「寫著純文字的紙」;一旦加上了 x,它就變成了一台「會自動幫你做事的機器」。
3. ⚠️ 觀念釐清:檔案與目錄的 rwx 差異 (極度重要!)
這絕對是新手最常踩坑的地方!同樣是 rwx,套用在「檔案」跟「目錄」上,意義完全不一樣!
| 權限 | 對於「一般檔案」的意義 | 對於「目錄 (資料夾)」的意義 |
|---|---|---|
| r | 可以查看檔案內容 (例如使用 cat) | 可以列出目錄底下的檔名 (例如使用 ls) |
| w | 可以修改檔案內容 (例如使用 vi) | 可以建立、刪除、更名該目錄下的檔案!(※與檔案本身的權限無關) |
| x | 可以把檔案當作程式來執行 | 可以 cd 進入該目錄,並讀取該目錄的 metadata |
💣 新手常踩大雷:
- 如果一個目錄沒有
x權限,就算你有r也無法用ls -l看到裡面的詳細屬性,你也無法cd進去!- 如果你想刪除一個檔案,你需要的不是檔案本身的
w權限,而是該檔案**「所在目錄」的w權限**!因為刪除檔案等於是「修改了目錄的內容清單」。
x 沒有 r/w 會發生什麼事?- 對於檔案:
- 如果是 Shell 腳本:會執行失敗!因為系統需要先「讀取(r)」純文字程式碼才能跑。
- 如果是編譯好的二進位檔 (如 C 語言編譯的程式):可以正常執行! 就像一個黑盒子,你能用它,但看不到裡面怎麼寫的。
- 對於目錄 (盲盒目錄/穿透目錄):
- 你不可以用
ls看裡面有哪些檔案 (因為沒有r)。 - 但是你可以
cd走進去!如果你「剛好知道」裡面有一個檔案叫secret.txt,且你有該檔案的權限,你可以直接精準存取它。實務上常用於分享單一檔案給別人,但不想讓他看光你資料夾裡還有什麼其他隱私。
- 你不可以用
4. 權限的計算:rwx 數字表示與 UGO 矩陣圖
為了讓電腦更快速判讀,我們通常把 rwx 轉換為八進位數字:
- r = 4
- w = 2
- x = 1
- - = 0
將 U、G、O 各自的權限加總,就會得到三碼數字:
rw- r-- r--👉(4+2+0) (4+0+0) (4+0+0)👉 644 (最常見的一般檔案權限)rwx r-x r-x👉(4+2+1) (4+0+1) (4+0+1)👉 755 (最常見的目錄或執行檔權限)
總是覺得在腦袋裡把 rwx 轉換成數字很燒腦嗎?
你可以使用 Linux Permissions Converter 視覺化小工具!
只要點選 User, Group, Other 的讀寫執行 Checkbox,就能即時雙向轉換為數字 (如 755) 或符號 (如 rwxr-xr-x),甚至會自動幫你產出 chmod 指令並給予資安評估建議喔!
5. 檢視與修改權限的實戰指令
stat 或 ls -l (檢視權限)
用來查看目前的權限與擁有者狀態。
$ ls -l project.txt
-rw-r--r--. 1 alice dev_team 1024 Jul 23 10:00 project.txt
# 最前面的 - 代表是一般檔案 (如果是 d 代表目錄)
# rw- (U 的權限), r-- (G 的權限), r-- (O 的權限)
# alice 是擁有者 (U), dev_team 是所屬群組 (G)
chmod (Change Mode:更改 rwx)
可以用「數字法」或「符號法」來修改權限。
# 數字法 (最常用,直接給絕對權限)
$ chmod 750 project_folder # U=rwx, G=r-x, O=---
# 符號法 (通常用來微調,例如只幫群組加上寫入權限)
$ chmod g+w project.txt
$ chmod o-r secret.log # 拔除路人的讀取權限
$ chmod a+x script.sh # 幫所有人 (all) 加上執行權限
chown (Change Owner:更改擁有者與群組)
通常只有 root 有權限把檔案過戶給別人。
# 只改擁有者
$ sudo chown bob project.txt
# 同時改擁有者與群組 (中間用冒號隔開)
$ sudo chown bob:dev_team project.txt
# 遞迴更改整個資料夾底下的所有檔案 (-R)
$ sudo chown -R bob:dev_team /var/www/html
chgrp (Change Group:單純更改群組)
(實務上大多直接用 chown user:group 一次搞定,但如果你只想改群組,可用這個)。
$ chgrp dev_team shared_doc.md
6. (補充) 系統預設權限管理:umask
為什麼我們每次 touch 新檔案預設都是 644,而 mkdir 目錄預設都是 755?
因為系統有一個「預設權限屏蔽」機制叫 umask。
系統的原始滿分權限:
- 檔案滿分是
666(因為檔案預設不該有執行權限) - 目錄滿分是
777(因為目錄需要能進入)
一般使用者的 umask 預設值通常是 002 或 022。
- 預設目錄權限:
777-022=755(rwxr-xr-x) - 預設檔案權限:
666-022=644(rw-r--r--)
這確保了系統的預設安全性:新建立的檔案,路人絕對無法去竄改。
🏢 實境演練:跨部門協作的共用資料夾
情境背景:
公司建立了一個共用資料夾 /opt/shared_project,老闆要求:
dev_team群組裡的成員 (Alice, Bob) 可以進去裡面建立、修改、刪除檔案。- 其他路人 (Others) 只能看裡面有什麼,不准亂動。
- 把整個資料夾與裡面現存內容的擁有權交給群組
dev_team,擁有者設為管理員root。
管理員的操作流程:
# 1. 將目錄的群組擁有權交給 dev_team,擁有者保持 root
$ sudo chown -R root:dev_team /opt/shared_project
# 2. 修改權限矩陣:
# - root (U) 需要全權處理:7 (rwx)
# - dev_team (G) 需要能讀、寫、進入建立檔案:7 (rwx)
# - Others (O) 只能看跟進入,不能修改:5 (r-x)
$ sudo chmod -R 775 /opt/shared_project
# 3. 檢查結果
$ ls -ld /opt/shared_project
drwxrwxr-x. 2 root dev_team 4096 Jul 23 12:00 /opt/shared_project
驗證結果:此時 Alice (隸屬 dev_team) 登入後,就能在裡面 touch new_file.txt,而路人 Eve 嘗試建立檔案則會收到 Permission denied 的無情拒絕!