[system] 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 %}