2 回答
TA贡献1785条经验 获得超8个赞
有点像这种ChownR()类型的函数,想法是过滤步行,并将 chown 仅应用于作为传入参数的路径的一部分的文件夹(此处"/var/test1/test2/test3)
无过滤器:
func ChownR(path string, uid, gid int) error {
return filepath.Walk(path, func(name string, info os.FileInfo, err error) error {
if err == nil {
err = os.Chown(name, uid, gid)
}
return err
})
}
换句话说,filepath.Walk()这里不应该涉及太多的“手工工作”。
TA贡献1906条经验 获得超10个赞
将 mkdir 进程切换到您希望为其创建目录的用户。这具有在单个命令中创建具有正确权限和所有权的目录的优点,而不是创建循环或背靠背运行多个命令。
例子:
import "os/exec"
import "syscall"
func main() {
// The command here can use flags to create all of the dirs at once
cmd := exec.Command('mkdir', '-p', '/var/test1/test2/test3/')
_ = syscall.Umask(0077) // Set umask for this process
cmd.SysProcAttr = &syscall.SysProcAttr{}
cmd.SysProcAttr.Credential = &syscall.Credential{Uid: uid, Gid: gid}
cmd.Run()
}
由于子进程“mkdir”以 指定的用户身份运行uid,因此文件夹已经拥有正确的所有者。如果 umask 部分正确,每个目录也将具有正确的权限。
一个警告:这不是一个非常便携的解决方案。如果您确定您的代码只会在特定的操作系统上执行,那么使用 syscall 应该只是您的解决方案。
- 2 回答
- 0 关注
- 177 浏览
添加回答
举报