diff --git a/backend/app/dto/request/file.go b/backend/app/dto/request/file.go index f4468fd93..8c887212d 100644 --- a/backend/app/dto/request/file.go +++ b/backend/app/dto/request/file.go @@ -22,6 +22,7 @@ type FileCreate struct { IsLink bool `json:"isLink"` IsSymlink bool `json:"isSymlink"` LinkPath string `json:"linkPath"` + Sub bool `json:"sub"` } type FileDelete struct { diff --git a/backend/app/service/file.go b/backend/app/service/file.go index 8bc371aa2..4214364a4 100644 --- a/backend/app/service/file.go +++ b/backend/app/service/file.go @@ -160,7 +160,11 @@ func (f *FileService) BatchDelete(op request.FileBatchDelete) error { func (f *FileService) ChangeMode(op request.FileCreate) error { fo := files.NewFileOp() - return fo.Chmod(op.Path, fs.FileMode(op.Mode)) + if op.Sub { + return fo.ChmodR(op.Path, op.Mode) + } else { + return fo.Chmod(op.Path, fs.FileMode(op.Mode)) + } } func (f *FileService) ChangeOwner(req request.FileRoleUpdate) error { diff --git a/backend/utils/cmd/cmd.go b/backend/utils/cmd/cmd.go index 9425d4851..83f2857fd 100644 --- a/backend/utils/cmd/cmd.go +++ b/backend/utils/cmd/cmd.go @@ -91,11 +91,6 @@ func Execf(cmdStr string, a ...interface{}) (string, error) { } func HasNoPasswordSudo() bool { - cmd := exec.Command("sudo", "-v") - err := cmd.Run() - if err != nil { - return false - } cmd2 := exec.Command("sudo", "-n", "ls") err2 := cmd2.Run() return err2 == nil diff --git a/backend/utils/files/file_op.go b/backend/utils/files/file_op.go index 2ee8b5b7b..91482f614 100644 --- a/backend/utils/files/file_op.go +++ b/backend/utils/files/file_op.go @@ -121,9 +121,12 @@ func (f FileOp) Chown(dst string, uid int, gid int) error { } func (f FileOp) ChownR(dst string, uid string, gid string, sub bool) error { - cmdStr := fmt.Sprintf("sudo chown %s:%s %s", uid, gid, dst) + cmdStr := fmt.Sprintf("chown %s:%s %s", uid, gid, dst) if sub { - cmdStr = fmt.Sprintf("sudo chown -R %s:%s %s", uid, gid, dst) + cmdStr = fmt.Sprintf("chown -R %s:%s %s", uid, gid, dst) + } + if cmd.HasNoPasswordSudo() { + cmdStr = fmt.Sprintf("sudo %s", cmdStr) } if msg, err := cmd.ExecWithTimeOut(cmdStr, 2*time.Second); err != nil { if msg != "" { @@ -134,8 +137,8 @@ func (f FileOp) ChownR(dst string, uid string, gid string, sub bool) error { return nil } -func (f FileOp) ChmodR(dst string, mode fs.FileMode) error { - cmdStr := fmt.Sprintf("chmod -R %v %s", mode, dst) +func (f FileOp) ChmodR(dst string, mode int64) error { + cmdStr := fmt.Sprintf("chmod -R %v %s", fmt.Sprintf("%04o", mode), dst) if cmd.HasNoPasswordSudo() { cmdStr = fmt.Sprintf("sudo %s", cmdStr) } diff --git a/frontend/src/api/interface/file.ts b/frontend/src/api/interface/file.ts index 12b28dee5..2d15d6201 100644 --- a/frontend/src/api/interface/file.ts +++ b/frontend/src/api/interface/file.ts @@ -54,6 +54,7 @@ export namespace File { isLink?: boolean; isSymlink?: boolean; linkPath?: boolean; + sub?: boolean; } export interface FileDelete { diff --git a/frontend/src/views/host/file-management/change-role/index.vue b/frontend/src/views/host/file-management/change-role/index.vue index 6619fd9f5..2174b6be7 100644 --- a/frontend/src/views/host/file-management/change-role/index.vue +++ b/frontend/src/views/host/file-management/change-role/index.vue @@ -7,6 +7,9 @@ + + {{ $t('file.containSub') }} +