[Go] 使用 unix.Umask() 設定檔案目錄預設屬性
今天專案的 Go 程式想要讓它建出來的目錄與檔案,
全都只有擁有者 (本例中是 root) 可以存取,
同群組 (group) 或非相關的使用者 (other) 全都不行。
查了一下,可以用 sys/unix 裡提供的 unix.Umask() 函式來設定 umask。
於是把程式改成這樣,將 group 的 RWX 和 other 的 RWX 全都設進 umask,
也就是 group/other 都不能有 RWX 權限:
package main import ( "golang.org/x/sys/unix" "os" ) func main() { unix.Umask(unix.S_IRWXG | unix.S_IRWXO) os.Create("/root/aaa") }
編譯時失敗了,出現 cannot find package “golang.org/x/sys/unix”:
root@localhost ~ # go run test.go test.go:5:9: cannot find package "golang.org/x/sys/unix" in any of: /usr/lib/golang/src/golang.org/x/sys/unix (from $GOROOT) /root/go/src/golang.org/x/sys/unix (from $GOPATH)
這是因為缺少了 sys/unix 這個套件,
用 go get
來下載並安裝套件:
go get golang.org/x/sys/unix
這時 go build 或 go run 就會成功了~
至於我們剛剛安裝的 sys/unix 在哪呢?
用 go env
可以看到 GOPATH 是指向 /root/go:
root@localhost ~ # go env GO111MODULE="" GOARCH="amd64" GOBIN="" GOCACHE="/root/.cache/go-build" GOENV="/root/.config/go/env" GOEXE="" GOFLAGS="" GOHOSTARCH="amd64" GOHOSTOS="linux" GOINSECURE="" GONOPROXY="" GONOSUMDB="" GOOS="linux" GOPATH="/root/go" GOPRIVATE="" GOPROXY="https://proxy.golang.org,direct" GOROOT="/usr/lib/golang" GOSUMDB="sum.golang.org" GOTMPDIR="" GOTOOLDIR="/usr/lib/golang/pkg/tool/linux_amd64" GCCGO="gccgo" AR="ar" CC="gcc" CXX="g++" CGO_ENABLED="1" GOMOD="" CGO_CFLAGS="-g -O2" CGO_CPPFLAGS="" CGO_CXXFLAGS="-g -O2" CGO_FFLAGS="-g -O2" CGO_LDFLAGS="-g -O2" PKG_CONFIG="pkg-config" GOGCCFLAGS="-fPIC -m64 -pthread -fmessage-length=0 -fdebug-prefix-map=/tmp/go-build809027469=/tmp/go-build -gno-record-gcc-switches"
在 /root/go 目錄下,可以找到 pkg/linux_amd64/golang.org/x/sys/unix.a 這個檔案,
這就是 sys/unix 套件囉:
root@localhost ~ # ll /root/go/pkg/linux_amd64/golang.org/x/sys/unix.a -rw-r--r--. 1 root root 1750270 Mar 8 14:56 /root/go/pkg/linux_amd64/golang.org/x/sys/unix.a
參考資料:
- Golang Umask Examples
- [Golang]go build show “cannot find package “golang.org/x/sys/unix””error message
- umask(2) – Linux manual page
- Permission Bits (The GNU C Library)
(本頁面已被瀏覽過 313 次)