Skip to content

Instantly share code, notes, and snippets.

@hayajo
Last active October 19, 2018 07:00
Show Gist options
  • Star 5 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save hayajo/69e31086345e8a95d40d to your computer and use it in GitHub Desktop.
Save hayajo/69e31086345e8a95d40d to your computer and use it in GitHub Desktop.
os.Mkdir(All)で01777なパーミッションのディレクトリを作成
package main
import (
"os"
"syscall"
)
func main() {
oldMask := syscall.Umask(0)
os.Mkdir("hoge_01", 01777) // NG
os.Mkdir("hoge_02", 04000777) // Linux: OK, OSX: NG
os.Mkdir("hoge_03", 0777 | os.ModeSticky) // Linux: OK, OSX: NG
os.Mkdir("hoge_04", os.FileMode(01777)) // NG
os.Mkdir("hoge_05", os.FileMode(04000777)) // Linux:OK, OSX: NG
os.Mkdir("hoge_06", os.FileMode(0777) | os.ModeSticky) // Linux: OK, OSX: NG
os.Mkdir("hoge_07", 0777)
os.Chmod("hoge_07", 01777) // Linux: NG, OSX: NG
os.Mkdir("hoge_08", 0777)
os.Chmod("hoge_08", 04000777) // Linux: OK, OSX: OK
os.Mkdir("hoge_09", 0777)
os.Chmod("hoge_09", 0777 | os.ModeSticky) // Linux: OK, OSX: OK
syscall.Umask(oldMask)
}
@hayajo
Copy link
Author

hayajo commented Sep 13, 2014

ちなみにOS X(BSD?)のmkdirでは下位9ビットしか見ないようなので、mkdir後にchmodしなきゃダメっぽいです。( mkdir(2) )

あと01777でダメなのは、golangの実装でModeStickyは04000000なので、もし指定するなら04000777にしなければダメです。( code.google.com/p/go/src/pkg/os/types.go )

というわけで、os.Mkdirではsuid, sgid, sticky bitを設定せずに、os.Mkdirしたあとにos.Chmodして設定したほうが確実っぽいです。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment