Linux 群組權限管理教學:chmod、chown 與 group 設定
2024/01/18
在 Linux 中,群組權限(Group Permissions) 是多人協作與系統安全的基礎。了解 owner、group、others 三種身份,掌握
chmod、chown、chgrp指令,以及群組管理的完整流程,是每個 Linux 使用者的必備技能。
Linux 權限基礎
Linux 採用嚴格的存取控制機制,每個檔案和目錄都有三種身份(Identity)和三種權限(Permission)的組合。
三種身份
| 身份 | 說明 | 符號 |
|---|---|---|
| Owner(擁有者) | 建立該檔案的使用者,通常是最高權限 | u(user) |
| Group(群組) | 擁有者所屬的群組,群組成員共享相同權限 | g(group) |
| Others(其他人) | 不屬於擁有者也不在群組內的所有其他使用者 | o(others) |
三種權限
| 權限 | 符號 | 數值 | 對檔案的意義 | 對目錄的意義 |
|---|---|---|---|---|
| Read(讀取) | r | 4 | 可以讀取檔案內容 | 可以列出目錄內容(ls) |
| Write(寫入) | w | 2 | 可以修改、刪除檔案 | 可以在目錄中新增、刪除檔案 |
| Execute(執行) | x | 1 | 可以執行此檔案(腳本或程式) | 可以進入此目錄(cd) |
讀懂 ls -l 輸出
$ ls -l my_file.txt
-rw-r--r-- 1 benz developers 1024 Jan 18 10:00 my_file.txt
逐欄解讀:
- rw- r-- r-- 1 benz developers 1024 Jan 18 10:00 my_file.txt
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ └── 檔案大小(bytes)
│ │ │ │ │ │ └──────────── 群組名稱
│ │ │ │ │ └──────────────────── 擁有者名稱
│ │ │ │ └───────────────────────── 硬連結數量
│ │ │ └───────────────────────────── others(其他人)的權限
│ │ └────────────────────────────────── group(群組)的權限
│ └─────────────────────────────────────── owner(擁有者)的權限
└─────────────────────────────────────────── 檔案類型(- 是一般檔案,d 是目錄)
數字表示法(Numeric Notation)
權限可以用數字來表示,把三種權限的數值加起來:
| 數字 | 權限組合 | 符號 | 說明 |
|---|---|---|---|
| 7 | 4+2+1 | rwx | 讀取 + 寫入 + 執行(完整權限) |
| 6 | 4+2 | rw- | 讀取 + 寫入(一般檔案常用) |
| 5 | 4+1 | r-x | 讀取 + 執行 |
| 4 | 4 | r-- | 只有讀取 |
| 0 | 0 | --- | 無任何權限 |
三位數字代表三種身份:
755 = rwx r-x r-x
│ │ └── others: 可讀、可執行(不可寫)
│ └────── group: 可讀、可執行(不可寫)
└────────── owner: 可讀、可寫、可執行(完整權限)
644 = rw- r-- r--
│ │ └── others: 只有讀取
│ └────── group: 只有讀取
└────────── owner: 可讀、可寫(不可執行)
chmod 指令完整用法
chmod(change mode)用來修改檔案或目錄的存取權限。
數字模式(Numeric Mode)
# 腳本給予擁有者完整權限,群組和其他人只能讀取和執行
chmod 755 script.sh
# -rwxr-xr-x
# 一般文件設定:擁有者可讀寫,其他人只能讀取
chmod 644 document.txt
# -rw-r--r--
# 只有擁有者能讀寫(私密設定檔常用)
chmod 600 ~/.ssh/id_rsa
# -rw-------
# 目錄通常設 755 讓其他人可以進入
chmod 755 /var/www/html
# 遞迴修改整個目錄及其所有內容
chmod -R 755 /var/www/html
符號模式(Symbolic Mode)
符號模式更直覺,適合只修改某個特定身份的某個權限:
# u=owner, g=group, o=others, a=all(三者)
# +=新增, -=移除, ==設定(完整覆蓋)
# 給擁有者加上執行權限
chmod u+x script.sh
# 移除群組的寫入權限
chmod g-w file.txt
# 設定其他人的權限為只有讀取(完整覆蓋)
chmod o=r file.txt
# 給所有人加上讀取權限
chmod a+r document.txt
# 同時設定多個身份的權限
chmod u=rw,g=r,o=r document.txt
# 等同於 chmod 644 document.txt
# 遞迴修改(符號模式也支援 -R)
chmod -R g+rw /home/benz/shared/
chown 指令
chown(change owner)用來修改檔案或目錄的擁有者,也可以同時修改群組。
# 查看目前擁有者
ls -l file.txt
# 修改擁有者(需要 root 或 sudo 權限)
sudo chown benz file.txt
# 同時修改擁有者和群組(格式:owner:group)
sudo chown benz:developers file.txt
# 只修改群組(擁有者不變):在冒號前留空
sudo chown :developers file.txt
# 遞迴修改整個目錄
sudo chown -R benz:developers /home/benz/projects/
# 實用範例:修正 web 伺服器檔案權限
sudo chown -R www-data:www-data /var/www/html/
chgrp 指令
chgrp(change group)用來單獨修改檔案或目錄的所屬群組:
# 修改單一檔案的群組
sudo chgrp developers file.txt
# 修改目錄及其所有內容的群組
sudo chgrp -R developers /home/benz/projects/
# 確認修改結果
ls -l file.txt
# -rw-r--r-- 1 benz developers 1024 Jan 18 10:00 file.txt
群組管理指令
查看群組資訊
# 查看目前使用者所屬的所有群組
groups
# 查看指定使用者的群組
groups benz
# 查看詳細的使用者和群組 ID 資訊
id
# 查看系統中所有群組(格式:群組名稱:密碼:GID:成員列表)
cat /etc/group
# 搜尋特定群組
grep "developers" /etc/group
建立和管理群組
# 建立新群組
sudo groupadd developers
# 建立指定 GID 的群組
sudo groupadd -g 1050 developers
# 將使用者加入群組(-aG 是附加模式,不移除其他群組)
sudo usermod -aG developers benz
sudo usermod -aG docker benz
# 從群組中移除使用者
sudo gpasswd -d benz developers
# 刪除群組
sudo groupdel developers
# 注意:修改群組後,使用者需要重新登入(或執行 newgrp)才能生效
newgrp developers
實用範例
範例一:團隊共享目錄設定
假設你有一個開發團隊,成員需要共用 /srv/project 目錄:
# 1. 建立群組
sudo groupadd dev-team
# 2. 將成員加入群組
sudo usermod -aG dev-team alice
sudo usermod -aG dev-team bob
sudo usermod -aG dev-team charlie
# 3. 建立共享目錄並設定擁有者和群組
sudo mkdir -p /srv/project
sudo chown root:dev-team /srv/project
# 4. 設定權限:擁有者完整權限,群組可讀寫,其他人無權限
sudo chmod 770 /srv/project
# 5. 設定 setgid bit:確保在此目錄下建立的新檔案都自動屬於 dev-team
sudo chmod g+s /srv/project
# 確認設定
ls -ld /srv/project
# drwxrws--- 2 root dev-team 4096 Jan 18 10:00 /srv/project
範例二:Web 伺服器檔案權限設定
# Nginx / Apache 的 web root 目錄標準權限設定
# Web 伺服器進程(www-data)需要讀取所有檔案,但不應該有寫入權限
# 設定目錄擁有者為你的帳號,群組為 www-data
sudo chown -R benz:www-data /var/www/html/mysite
# 目錄:擁有者完整權限,群組和其他人只能讀取和進入
find /var/www/html/mysite -type d -exec chmod 755 {} \;
# 一般檔案:擁有者可讀寫,群組和其他人只能讀取
find /var/www/html/mysite -type f -exec chmod 644 {} \;
# 如果有需要 PHP 寫入的目錄(如上傳目錄),開放群組寫入
sudo chmod 775 /var/www/html/mysite/uploads
sudo chown www-data:www-data /var/www/html/mysite/uploads
範例三:保護敏感設定檔
# SSH 私鑰:只有擁有者可以讀寫,其他人完全無法存取
chmod 600 ~/.ssh/id_rsa
# -rw-------
# SSH 公鑰:可以讓其他人讀取
chmod 644 ~/.ssh/id_rsa.pub
# .env 設定檔(含資料庫密碼等敏感資訊):只有擁有者能讀寫
chmod 600 .env
# 整個 .ssh 目錄只有擁有者能進入
chmod 700 ~/.ssh
# 如果 SSH 私鑰權限不對,SSH 登入會失敗並報錯:
# "Permissions 0644 for '/home/benz/.ssh/id_rsa' are too open."
常見問題(FAQ)
Q1:755 和 644 分別適合哪些使用情境?
這兩個是最常見的權限設定:
- 755(rwxr-xr-x):適合目錄和可執行腳本。擁有者可以完全控制,群組和其他人可以進入目錄和執行腳本,但不能修改內容。
- 644(rw-r–r–):適合一般文件(HTML、CSS、圖片、設定檔等)。擁有者可以讀寫,群組和其他人只能讀取。
Q2:usermod -aG 和 usermod -G 有什麼差別?一定要加 -a 嗎?
這個差別非常重要,請務必記住:
# 危險!-G 會「取代」使用者的所有群組
sudo usermod -G developers benz
# 如果 benz 原本在 sudo、docker 群組,執行後會全部消失!
# benz 只剩下 developers 這一個附加群組
# 正確!-aG 是「附加(append)」到群組,不影響現有群組
sudo usermod -aG developers benz
# benz 原本的 sudo、docker 群組都保留,再加上 developers
所以一定要加 -a 參數,否則使用者可能會突然失去 sudo 等重要權限。
Q3:我已經設定了權限,為什麼還是無法進入目錄?
目錄需要「執行權限(x)」才能進入(cd 進去)。只有讀取權限(r)只能列出目錄內容(ls),但無法實際進入。
# 如果目錄是 dr--r--r--(沒有 x)
ls directory/ # 可以列出,但...
cd directory/ # 錯誤:Permission denied
# 正確設定:目錄需要 x 才能進入
chmod 755 directory/ # rwxr-xr-x,可以進入
chmod 711 directory/ # rwx--x--x,可以進入但不能列出內容
# 父目錄也要有 x 權限
# 例如要存取 /home/benz/data/,路徑上每個目錄都需要 x 權限
延伸閱讀: