# Linux chmod、chgrp、chown 權限管理筆記
[TOC]
感謝您點進本篇文章,我是 LukeTseng,近期接觸到 Linux 系統,時常需要面對黑色終端機,有些時候想做到一些操作,卻也不知道那個指令叫什麼,我也沒有好好奠基 Linux 的基礎指令,所以特此製作本篇文章!希望能解決到你我的痛點!
若本篇文章某處有誤,敬請告知,感謝!
## Linux 檔案、目錄權限
Linux 的檔案權限分為三個層級:
- 擁有者(Owner/User, u):檔案的所有者。
- 群組(Group, g):與檔案擁有者同群組的使用者。
- 其他人(Others, o):系統上其他所有使用者。
每個層級可以設定三種權限:
- r(read, 讀取):數字值為 4,可以查看檔案內容或列出目錄內容。
- w(write, 寫入):數字值為 2,可以修改檔案或在目錄中新增 / 刪除檔案。
- x(execute, 執行):數字值為 1,可以執行檔案或進入目錄。
當在輸入 `ls -l` 時,會列出像以下這些東西:

其中 `drwxr-xr-x` 就是檔案或目錄的權限,可以分成三個部分來看:
```
d rwx r-x r-x
1 234 567 890
```
其中第一個欄位是檔案類型,有以下這幾種檔案類型:
- `-`:普通檔案
- `d`:directory,目錄。
- `p`:pipe 管道檔案。
- `l`:link 符號連結。
第 2~4 欄位是擁有者(u:owner)的權限:
- `r`:可讀(read) = 4。
- `w`:可寫(write) = 2。
- `x`:可執行(execute) = 1。
- `-`:沒有權限。
第 5~7 欄位是群組(g:group)權限,內容與上方(owner)敘述相同,第 8~0 欄位是其他人(o:others)權限,內容同上。
這串 `rwxr-xr-x` 可以表示成 7(`rwx`)5(`r-x`)5(`r-x`),每個數字左到右代表的是 u(owner)、g(group)、o(others)這些人的權限。
## chmod 更改檔案、目錄權限
chmod 是取自 change mode 的縮寫,分成兩種模式,一種是數字模式,另一種是符號模式。
### 數字模式
先來講講數字模式:
數字模式透過三位八進位數字來設定權限,每位數字是權限值的總和:
* 0:無權限(`---`)
* 1:僅執行(`--x`)
* 2:僅寫入(`-w-`)
* 3:寫入+執行(`-wx`)
* 4:僅讀取(`r--`)
* 5:讀取+執行(`r-x`)
* 6:讀取+寫入(`rw-`)
* 7:完整權限(`rwx`)
範例:
```bash
chmod 644 file.txt # -rw-r--r-- 擁有者可讀寫,其他人僅可讀
chmod 755 script.sh # -rwxr-xr-x 擁有者完整權限,其他人可讀取執行
chmod 700 private.txt # -rwx------ 僅擁有者有完整權限
chmod 777 shared.txt # -rwxrwxrwx 所有人完整權限
```
### 符號模式
接下來是符號模式,符號模式使用字母組合來新增、移除或設定權限:
操作對象:
- `u`:擁有者(user)。
- `g`:群組(group)。
- `o`:其他人(others)。
- `a`:所有人(all)。
操作符號:
- `+`:新增權限。
- `-`:移除權限。
- `=`:設定特定權限(清除其他權限後會重新設定)。
範例:
```bash
chmod u+x script.sh # 給擁有者新增執行權限
chmod a+r file.txt # 給所有人新增讀取權限
chmod g-w document.txt # 移除群組的寫入權限
chmod u=rw,g=r,o=r file.txt # 設定擁有者讀寫,群組和其他人僅讀取
chmod go-rwx private.txt # 移除群組和其他人的所有權限
```
### 常用參數
- `-R`:遞迴,對目錄及其所有子目錄和檔案套用權限變更。
- `-v`:詳細模式,顯示每個檔案的權限變更情況。
- `-c`:僅顯示有變更的檔案。
- `-f`:安靜模式,不顯示錯誤訊息。
範例:
```bash
chmod -R 755 /var/www/html # 遞迴設定整個網站目錄權限
chmod -v 644 *.txt # 詳細顯示每個 txt 檔案的權限變更
```
## chown
chown(change owner)是 Linux 系統中用來變更檔案或目錄「擁有者」和「群組」的指令。
擁有者(owner)以及群組(group)可用 `ls -l` 查看,於第三欄、第四欄就會顯示誰是擁有者以及群組:

第三欄(左邊紅框)是擁有者,第四欄(右邊紅框)是群組。
chown 主要做以下這三件事情:
- 變更檔案或目錄的擁有者(誰擁有這個檔案)。
- 變更檔案或目錄的群組(哪個群組的成員可以存取這個檔案)。
- 同時變更擁有者與群組。
基本語法:
```bash
chown [options] [owner][:[group]] <files or directories>
```
owner:可為使用者名稱或使用者 ID。
group:可為群組名稱或群組 ID。
`:`(冒號):分隔 owner 與 group。
常用參數與 chmod 相同:
- `-R`:遞迴,對目錄及其所有子目錄和檔案套用權限變更。
- `-v`:詳細模式,顯示每個檔案的權限變更情況。
- `-c`:僅顯示有變更的檔案。
- `-f`:安靜模式,不顯示錯誤訊息。
相關範例:
- 只改變擁有者:`sudo chown alice file.txt`
`file.txt` 的擁有者變成 `alice`,群組不變。
- 只改變群組:`sudo chown :devteam file.txt`
`file.txt` 的群組變成 `devteam`,擁有者不變。
- 同時改變擁有者和群組:`sudo chown alice:devteam file.txt`
`file.txt` 的擁有者變成 `alice`,群組變成 `devteam`。
- 遞迴更改整個目錄及其內容:`sudo chown -R alice:devteam project_folder`
`project_folder` 及其所有子目錄、檔案的擁有者和群組都變更。
### 使用權限
- 只有 root 或檔案擁有者可以更改檔案的擁有者。
### 疑難雜症
- 權限不足:一般使用者無法隨意更改檔案擁有者,需加 `sudo`。
- 目錄遞迴未加 `-R`:只會改變目錄本身,不會影響裡面的檔案。
## chgrp
chgrp 是取自 change group 的縮寫,是 Linux 系統中用來變更檔案或目錄所屬群組的指令。
基本語法:
```bash
chgrp [options] <group_name or group_ID> <files or directories>
```
群組名稱須已存在於 `/etc/group` 檔案中。
常用參數與 chmod 相同:
- `-R`:遞迴,對目錄及其所有子目錄和檔案套用權限變更。
- `-v`:詳細模式,顯示每個檔案的權限變更情況。
- `-c`:僅顯示有變更的檔案。
- `-f`:安靜模式,不顯示錯誤訊息。
相關範例:
- 更改單一檔案的群組:`chgrp developers file.txt`
讓 `file.txt` 歸屬於 `developers` 群組。
- 更改多個檔案的群組:`chgrp users file1.txt file2.txt`。
同時更改多個檔案的群組。
- 遞迴更改目錄及其內容的群組:`chgrp -R www-data /var/www/html`
讓整個網站目錄及其所有檔案都歸屬於 www-data 群組。
### 使用權限
- 只有檔案擁有者或 `root` 管理員可以執行 `chgrp`。
- 要是目標群組的成員才可以用,否則會出現權限錯誤。
## whoami
`whoami` 是在 Linux 查看目前有效使用者名稱的指令,只要直接輸入即可,效力等同於 `id -un` 指令。
## 總整理
Linux 檔案權限分為三個層級(`user`、`group`、`others`),每層級有三種權限:
- `r`(讀取)= 4
- `w`(寫入)= 2
- `x`(執行)= 1
使用 `ls -l` 查看時,如 `drwxr-xr-x`:
* 第 1 位:檔案類型(`-` 普通檔、`d` 目錄、`l` 連結、`p` 管道)。
* 第 2-4 位:擁有者(owner)權限。
* 第 5-7 位:群組(group)權限。
* 第 8-10 位:其他人(others)權限。
### chmod(變更權限)
數字模式:
```bash
chmod 644 file.txt # 擁有者讀寫,其他人唯讀
chmod 755 script.sh # 擁有者完整,其他人讀+執行
```
符號模式:
```bash
chmod u+x script.sh # 擁有者增加執行權限
chmod go-rwx private.txt # 移除群組和其他人所有權限
chmod u=rw,g=r file.txt # 設定特定權限組合
```
### chown(變更擁有者、群組)
```bash
chown alice file.txt # 改變擁有者
chown :devteam file.txt # 改變群組
chown alice:devteam file.txt # 同時改變擁有者和群組
chown -R alice:devteam folder/ # 遞迴更改整個目錄
```
### chgrp(變更群組)
```bash
chgrp developers file.txt # 改變單一檔案群組
chgrp -R www-data /var/www/ # 遞迴改變目錄群組
```
### 常用參數
三個指令共用這些參數:
* `-R`:遞迴處理目錄及子內容。
* `-v`:顯示詳細變更過程。
* `-c`:僅顯示有變更的檔案。
* `-f`:安靜模式,隱藏錯誤訊息。
### 注意事項
- 變更擁有者需要 `root` 權限(使用 `sudo`)。
- 目標群組必須存在於 `/etc/group`。
- 遞迴操作記得加 `-R`,否則只影響目錄本身。
## 參考資料
[Linux 檔案權限教學:深入理解 chmod 指令與 -rw-r-r- 實用設定方法 - オープンソースの力を活用する方法~Ubuntuの世界へようこそ~](https://www.linux.digibeatrix.com/zh/security-and-user-management/linux-chmod-permission-guide/)
[Linux chmod 命令 | 菜鸟教程](https://www.runoob.com/linux/linux-comm-chmod.html)
[Linux - Chmod 工具管理檔案/目錄權限 - HowHow の WebSite](https://how64bit.com/posts/linux/2022/linux-chmod-permission-tool/)
[Linux命令中chmod 777 以及drwxr-xr-x分别代表什么意思-腾讯云开发者社区-腾讯云](https://cloud.tencent.com/developer/article/1838097)
[Linux檔案權限配置- FineReport帮助文档 - 全面的报表使用教程和学习资料](https://help.fanruan.com/finereport-tw/doc-view-222.html)
[Linux chgrp 命令 | 菜鸟教程](https://www.runoob.com/linux/linux-comm-chgrp.html)
[鳥哥私房菜 - 第五章、Linux 的檔案權限與目錄配置](https://linux.vbird.org/linux_basic/centos7/0210filepermission.php)
[Lunix chgrp 命令详解-CSDN博客](https://blog.csdn.net/qq646748739/article/details/81137576)
[簡單易懂的 chown 指令使用指南:改變檔案和目錄的擁有者](https://vocus.cc/article/64dd7bd6fd897800018f68e2)
[Linux 更改檔案擁有者與群組,chown 指令使用教學與範例 – G. T. Wang](https://blog.gtwang.org/linux/linux-chown-command-tutorial/)