權限 / umask === ###### tags: `OS / Ubuntu / cmd / system` ###### tags: `OS`, `Ubuntu`, `linux`, `command`, `system`, `config`, `umask`, `權限` <br> [TOC] <br> > by gpt-5 (2025/10/17) <br> ## umask 是什麼? - **作用**: - 決定「新建立檔案/資料夾」的**預設權限要拿掉哪些位元**(是“遮罩”,只會減,不會加)。 - **原理**: - 一般程式建立檔案會以「基準權限」開始──檔案 `666`、目錄 `777`──再用 - **實際權限 = 基準權限 − umask** 計算出來。 - **計算範例:umask=002** - 檔案 `666` 計算方式 - `rw-rw-rw-`(666) -> 基準權限 - `-------w-`(002) -> umask - `rw-rw-r--`(664) -> 實際權限 - 目錄 `777` 計算方式 - `rwxrwxrwx`(777) -> 基準權限 - `-------w-`(002) -> umask - `rwxrwxr-x`(775) -> 實際權限 <br> ## 兩個最常用的 umask * **022** → 檔案 `644`、目錄 `755`(適合個人主機,其他人不可寫) * **002** → 檔案 `664`、目錄 `775`(適合團隊合作,**群組可寫**) > 小抄: > `022` → -w 套用到 group/others; > `002` → -w 只套用到 others。 <br> ## 怎麼看/怎麼設 ```bash umask # 顯示八進位(常見:0022 或 0002) umask -S # 顯示符號式,例如 u=rwx,g=rx,o=rx umask 002 # 臨時把本 shell 的 umask 改成 002 umask 022 # 改回個人常用 ``` <br> ## 快速驗證 ```bash umask 002 touch f && mkdir d ls -l f d # 你會看到 f→-rw-rw-r-- (664), d→drwxrwxr-x (775) ``` <br> ## 永久設定(登入就生效) * 只改自己: * Bash:把 `umask 002` 加到 `~/.bashrc`(或 `~/.profile`)。 * Zsh:加到 `~/.zshrc`。 * 全系統(所有互動式 shell):`/etc/profile`、`/etc/bash.bashrc` 補一行 `umask 022`/`002`。 <br> ## 團隊/專案最佳實務 1. **共用專案資料夾**: ``` sudo chgrp -R project-ocis /proj/ocis sudo chmod -R 2775 /proj/ocis # 設 setgid,讓新檔繼承群組 ``` 2. **開發者的 umask 用 002**,配合 `newgrp project-ocis`,新檔就會是群組可寫(664/775)。 3. 若還不夠穩:加**預設 ACL**(讓“不聽話”的程式也被規範) ``` setfacl -R -m d:g:project-ocis:rwx -m g:project-ocis:rwx /proj/ocis ``` <br> ## 容器/Kubernetes/服務 * **容器**:umask 在**程序內**決定;可在 entrypoint(或 `bash -lc`)裡先 `umask 002`。 * **systemd 服務**:可在 unit 檔寫 `UMask=002`。 * **Kubernetes**:umask 仍在容器內設定;若是群組寫入需求,也常搭配 `fsGroup` 與上面的 setgid/ACL。 <br> ## 常見問題 * **為什麼我設 002,檔案還是 600?** 程式可能用更嚴格的模式(如 `0600`)建立;umask**無法加權限**,只能減少。 * **會動到 setuid/setgid/sticky 嗎?** 不會,umask只影響 rwx 權限位。 * **SSH 抱怨權限太鬆?** `.ssh` 與 key 檔案常要求 700/600;請個別 `chmod`,不要靠放寬 umask。 <br> {%hackmd vaaMgNRPS4KGJDSFG0ZE0w %}