1 回答
TA贡献1858条经验 获得超8个赞
首先,正如Burak Serdar 在评论中指出的那样,确保这确实是一个新文件,因为操作系统通常会在覆盖现有文件时保留现有权限(尽管细节是特定于操作系统的,尤其是某些 Unix -ish 操作系统在此处清除 setuid/setgid)。
Unix/Linux 文件权限通过让操作系统从程序请求被授予的权限中清除用户请求被删除的任何权限来工作。
也就是说,当调用创建新文件的文件系统操作时,您在代码中提供了一种模式。在这种情况下,您提供0777的确实是rwxrwxrwx.
然而,与此同时,用户的操作环境1包含另一种称为umask的八进制模式。在这种情况下,它大概是022或----w--w-。这些权限将从您提供的权限中删除0777 & (^022): is 0755which is rwxr-xr-x. 所以新创建的文件有模式rwxr-xr-x,或者0755,即使你的程序要求0777。
出于这个原因,大多数 Unix 程序在文件创建操作期间应该使用两种模式之一:0777用于目录和可执行文件,以及0666用于非可执行文件。用户的 umask 将删除不需要的权限:想要隐私的用户可以将他们的 umask 设置为对于组和其他都077将删除,只留下或酌情留下。rwx07000600
此规则的一个例外是,任何想要确保额外隐私的程序ssh(例如 -相关代码,当它创建密钥对时)都应该提供其模式,0600以便在第一个中没有设置组和其他用户权限位地方。
请注意,chmod呼叫没有应用用户的 umask 设置。如果您需要发现用户的 umask 来计算chmod调用的正确值,请使用新的golang.org/sys/x/unixUmask函数或旧的syscallUmask函数。不幸的是,您必须提供一个新的umask 才能发现原来的umask。这将取代每个进程的 umask,直到您重新安装原始值。因此,您可能希望在 init 函数中执行此操作,并将结果存储在变量中以便妥善保管,同时恢复原始结果:
var Umask int
func init() {
Umask = unix.Umask(0777)
unix.Umask(Umask)
}
例如(假设新样式;旧样式syscall.Umask用法相同;都不返回任何错误)。但是,这使您的程序特定于 Unix。
- 1 回答
- 0 关注
- 233 浏览
添加回答
举报