跳至主要内容

目錄與檔案權限管理

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):可執行。
  • - (沒有權限):如果那個位置是減號,代表沒有該項權限。
💡 觀念釐清:Linux 的「執行 (x)」與 Windows 有什麼不同?

在 Windows 裡,系統是靠**「副檔名」**來決定檔案能不能執行(例如 .exe.bat)。 但在 Linux 裡,副檔名毫無意義!決定一個檔案能不能被當作程式來跑的唯一標準,就是它有沒有被賦予 x 權限。 如果一個檔案沒有 x,它就只是一張「寫著純文字的紙」;一旦加上了 x,它就變成了一台「會自動幫你做事的機器」。

3. ⚠️ 觀念釐清:檔案與目錄的 rwx 差異 (極度重要!)

這絕對是新手最常踩坑的地方!同樣是 rwx,套用在「檔案」跟「目錄」上,意義完全不一樣!

權限對於「一般檔案」的意義對於「目錄 (資料夾)」的意義
r可以查看檔案內容 (例如使用 cat)可以列出目錄底下的檔名 (例如使用 ls)
w可以修改檔案內容 (例如使用 vi)可以建立、刪除、更名該目錄下的檔案!(※與檔案本身的權限無關)
x可以把檔案當作程式來執行可以 cd 進入該目錄,並讀取該目錄的 metadata

💣 新手常踩大雷

  1. 如果一個目錄沒有 x 權限,就算你有 r 也無法用 ls -l 看到裡面的詳細屬性,你也無法 cd 進去!
  2. 如果你想刪除一個檔案,你需要的不是檔案本身的 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 (最常見的目錄或執行檔權限)
🛠️ 實用工具推薦:Linux UGO 權限轉換器

總是覺得在腦袋裡把 rwx 轉換成數字很燒腦嗎? 你可以使用 Linux Permissions Converter 視覺化小工具! 只要點選 User, Group, Other 的讀寫執行 Checkbox,就能即時雙向轉換為數字 (如 755) 或符號 (如 rwxr-xr-x),甚至會自動幫你產出 chmod 指令並給予資安評估建議喔!

5. 檢視與修改權限的實戰指令

statls -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 預設值通常是 002022

  • 預設目錄權限777 - 022 = 755 (rwxr-xr-x)
  • 預設檔案權限666 - 022 = 644 (rw-r--r--)

這確保了系統的預設安全性:新建立的檔案,路人絕對無法去竄改。

🏢 實境演練:跨部門協作的共用資料夾

情境背景: 公司建立了一個共用資料夾 /opt/shared_project,老闆要求:

  1. dev_team 群組裡的成員 (Alice, Bob) 可以進去裡面建立、修改、刪除檔案。
  2. 其他路人 (Others) 只能看裡面有什麼,不准亂動。
  3. 把整個資料夾與裡面現存內容的擁有權交給群組 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 的無情拒絕!