---
# System prepended metadata

title: Group Write Permission

---

# Group Write Permission

Python open/Golang open 開新檔案時，並不是直接按照 user 給的權限。

例如：

```go
package main

import (
	"os"
)

func main() {
	os.OpenFile("aa.lock", os.O_RDWR|os.O_CREATE, 0664)
}
```

沒特別設定是沒辦法生出權限為 0664 的檔案。

這主要是源於 `os.OpenFile` 使用的 linux open，而根據 man open:

> The effective mode is modified by the process's umask in the usual way: in the absence of a default ACL, the mode of the created file is (mode & ~umask).

而 default umask 是 `022` ，意思是預設把 group write / other write 關掉。

所以要解決的話有兩個方法:

* [設定 umask](#umask)
* [設定 Default folder acl](#default-folder-acl)

當然還有土法煉鋼的方式:

* 建立完檔案直接用 chmod 更動，但是這樣建立檔案/chmod會有時間差。

## umask

在呼叫 `open` 前先設定 umask。
要注意這設定是 process 級別的，所以假如嘗試這樣處理

```
oldValue = umask(002)
// ...
umask(oldValue)
```

這段就不會是 thread-safe 。

當然，可以考慮讓整隻程式都 `umask(002)`，但挺髒的。

## Default folder ACL

設定該檔案的資料的預設 Auth Control List 算是一個比較健康的方法：

umasktest 是上面的 golang 程式

```
$ ../umasktest/umasktest 
$ ls -al
total 12
drwxrwxr-x 2 alice   myteam  4096 Feb 18 10:28 .
drwxr-xr-x 5 root    root    4096 Feb 18 10:26 ..
-rw-r--r-- 1 alice   myteam     2 Feb 18 10:26 1
-rw-r--r-- 1 alice   myteam     0 Feb 18 10:28 aa.lock 
# 設定前沒有 group write 權限
$ setfacl -d -m g:myteam:rwx .
$ getfacl .
# file: .
# owner: alice
# group: myteam
user::rwx
group::rwx
other::r-x
default:user::rwx
default:group::rwx
default:group:myteam:rwx
default:mask::rwx
default:other::r-x

$ rm aa.lock 
$ ../umasktest/umasktest 
$ ls -al
total 12
drwxrwxr-x+ 2 alice   myteam  4096 Feb 18 10:32 .
drwxr-xr-x  5 root    root    4096 Feb 18 10:26 ..
-rw-r--r--  1 alice   myteam     2 Feb 18 10:26 1
-rw-rw-r--+ 1 alice   myteam     0 Feb 18 10:32 aa.lock # 有了!
```

