为了账号安全,请及时绑定邮箱和手机立即绑定

递归创建具有特定所有者和组的目录

递归创建具有特定所有者和组的目录

Go
HUH函数 2021-11-15 16:49:20
我想递归地创建一个目录并为创建的文件夹及其父级分配一个所有者和组。例如,假设/var存在,我想创建/var/test1/test2/test3.我可以使用os.MkdirAll("/var/test1/test2/test3", 0600).不过,我也想一套test1,test2和test3的uid来user1和gid到user1。可以使用 来做到这一点os.Chown,但这需要大量的手动工作。在创建文件夹链之前,我需要构建一个不存在的文件夹树及其父文件夹,然后os.Chown在创建后在每个文件夹上使用。有没有更简单的方法?
查看完整描述

2 回答

?
慕的地10843

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()这里不应该涉及太多的“手工工作”。


查看完整回答
反对 回复 2021-11-15
?
隔江千里

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 应该只是您的解决方案。


查看完整回答
反对 回复 2021-11-15
  • 2 回答
  • 0 关注
  • 177 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信