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 關注
- 206 瀏覽
添加回答
舉報