今天做 POC(Proof of Concept) 的时候,遇到了一个小问题——使用 golang 标准库的 os.Mkdir(name string, perm FileMode) 创建得到的文件夹的文件权限和 perm 权限设置的不一样。为什么会这样呢?那就得要谈谈**文件权限掩码 (umask)**了。

  用户在 linux 系统中创建一个文件的默认权限是由两部分决定的——基本码文件权限掩码 (umask)。文件夹的基本码是 rwxrwxrwx(777),文件的基本码是 rw-rw-rw- (666)。默认情况下 umask 值是022,这时建立的文件夹的默认权限是755(7-0, 7-2, 7-2),建立的文件的默认权限是644 (6-0, 6-2, 6-2)。通过 umask 命令可以查看/修改当前系统的文件权限掩码 (umask)。   那么,有没有办法在创建文件夹的时候忽略掉 umask 吗?当然有,以 mkdir 命令为例:使用 man mkdir 查看帮助能看到 mkdir 有个 -m 参数可以直接设置文件夹的最终权限,从而避开 umask

  说到这里,让我们回头看看最开始说的小问题。显然,我们可以通过 os.Exec 函数执行带有 -m 参数的 mkdir 命令来达到目标。不过,我这里还有另外一个方法来解决这个问题。创建文件夹时设置 umask000,之后改回原来的 umask。代码如下: