[Go] 使用 unix.Umask() 設定檔案目錄預設屬性

[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

 

參考資料:

(本頁面已被瀏覽過 9 次)

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。

這個網站採用 Akismet 服務減少垃圾留言。進一步瞭解 Akismet 如何處理網站訪客的留言資料