创建文件或目录时应立即设权限,避免事后用os.chmod补救;推荐os.writefile("token.txt", data, 0600)一步到位,权限值须用八进制(如0600),注意umask影响及跨平台差异。

创建文件或目录时就该定好权限,别等写完再改——中间存在时间窗口,敏感内容可能被其他进程读到。
os.WriteFile 和 os.OpenFile 创建时直接设权限
最安全的做法是在写入瞬间就设定权限,而不是事后调用 os.Chmod 补救。比如密钥文件必须私有:
-
os.WriteFile("token.txt", data, 0600):一步到位,所有者可读写,组和其他人无任何权限 -
os.OpenFile("log.txt", os.O_CREATE|os.O_APPEND, 0644):日志文件常用,所有者可读写,组和其他人只读 - 注意:
0644是八进制,不是十进制 644;写成644(没前导 0)会被 Go 当作八进制1204解析,结果完全不可控 - 实际生效权限还受系统
umask影响(如umask=0022时,0666会变成0644),生产环境建议显式指定所需权限,不依赖默认值
os.Mkdir 创建目录时的权限设置要点
目录权限中执行位(x)表示“可遍历”,不是“可执行”,这点和文件不同。设错会导致 cd 或 filepath.WalkDir 失败。
-
os.Mkdir("mydir", 0700):仅所有者可读、写、遍历,适合存放敏感配置的父目录 -
os.Mkdir("shared", 0755):所有者全权,组和其他人可读+遍历(但不能写),适合公开资源目录 - 必须加前导
0才是八进制;755不合法,0755才对 - 如果需要递归建目录(如
/a/b/c),用os.MkdirAll,它也接受perm参数,但只有最后一级目录按该权限创建,上级目录用0755(不可控),如有强一致性要求,得手动逐级Mkdir
os.Chmod 修改已有文件权限的风险与检查
os.Chmod 不检查文件是否存在、是否为普通文件、当前用户是否是 owner,出错只返回泛化错误,容易误判。
- 调用前务必先
os.Stat预检: info, err := os.Stat("config.yaml")- 检查
err != nil(文件不存在 / 权限不足) - 检查
info.Mode().IsRegular()(确保是普通文件,不是目录或设备) - 权限掩码要完整覆盖:想“仅关闭写位”,不能直接写
0444(会清掉执行位),而应做位运算:curr &^ 0222 - Windows 上
os.Chmod只识别只读/可写语义,0755和0644效果一样,执行位 x 完全被忽略
跨平台权限逻辑必须收口处理
Go 的权限 API 在 Windows 上是模拟层,0755、0644 等数值虽可传入,但底层只映射为“只读”或“可写”两个状态,组/其他人权限、执行位全部失效。
- 不要在 Windows 上依赖
info.Mode().Perm() & 0004判断“组是否可读”——它永远不成立 - 关键路径(如配置加载)应组合检查:
存在 + 是普通文件 + 所有者匹配 + 权限 ≤ 0600 - 避免用
info.Mode().String()(如-rw-r--r--)解析权限,字符串格式跨平台不一致且脆弱 - 读取前检查权限比报错后再处理更可靠;很多程序假设“能打开就能读”,但文件可能已被
chown掉或设为只读,导致后续写失败
真正麻烦的不是语法怎么写,而是 umask 干扰、Windows 模拟失真、符号链接陷阱、以及那个“创建即设权”的时间窗口——这几个点漏一个,线上就可能出权限泄露或静默失败。
golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!











