diff --git a/agent/app/service/agents_skills.go b/agent/app/service/agents_skills.go index 6a0792ad6..b44e14c72 100644 --- a/agent/app/service/agents_skills.go +++ b/agent/app/service/agents_skills.go @@ -753,13 +753,17 @@ func loadOpenclawSkillSearchOutput(containerName, source, keyword string) (strin case "skillhub": return cmd.RunDockerExecWithStdout(2*time.Minute, containerName, "skillhub", "search", keyword, "--json") default: - return cmd.RunDockerExecWithStdout( - 2*time.Minute, - containerName, - "sh", - "-c", - fmt.Sprintf("CLAWHUB_REGISTRY=%q clawhub search %q", resolveClawhubRegistry(source), keyword), - ) + return cmd.NewCommandMgr(cmd.WithTimeout(2*time.Minute)). + RunWithStdout( + "docker", + "exec", + "-e", + "CLAWHUB_REGISTRY="+resolveClawhubRegistry(source), + containerName, + "clawhub", + "search", + keyword, + ) } } diff --git a/agent/app/service/image_repo.go b/agent/app/service/image_repo.go index 1eb0d4a83..a663a11dc 100644 --- a/agent/app/service/image_repo.go +++ b/agent/app/service/image_repo.go @@ -198,10 +198,10 @@ func (u *ImageRepoService) Update(req dto.ImageRepoUpdate) error { } func (u *ImageRepoService) CheckConn(host, user, password string) error { - cmdMgr := cmd.NewCommandMgr() - stdout, err := cmdMgr.RunWithStdout("docker", "login", "-u", user, "-p", password, host) + cmdMgr := cmd.NewCommandMgr(cmd.WithStdin(strings.NewReader(password))) + stdout, err := cmdMgr.RunWithStdout("docker", "login", "-u", user, "--password-stdin", host) if err != nil { - return fmt.Errorf("stdout: %s, stderr: %v", stdout, err) + return fmt.Errorf("docker login failed: %v", err) } if strings.Contains(string(stdout), "Login Succeeded") { return nil diff --git a/agent/utils/cmd/cmdx.go b/agent/utils/cmd/cmdx.go index 998962389..55cc7de6d 100644 --- a/agent/utils/cmd/cmdx.go +++ b/agent/utils/cmd/cmdx.go @@ -26,6 +26,7 @@ type CommandHelper struct { workDir string outputFile string scriptPath string + stdin io.Reader env []string timeout time.Duration taskItem *task.Task @@ -331,6 +332,9 @@ func (c *CommandHelper) run(name string, arg ...string) (string, error) { if len(c.workDir) != 0 { cmd.Dir = c.workDir } + if c.stdin != nil { + cmd.Stdin = c.stdin + } defer func() { for _, closer := range loggerClosers { _ = closer.Close() @@ -435,6 +439,11 @@ func WithScriptPath(scriptPath string) Option { s.scriptPath = scriptPath } } +func WithStdin(stdin io.Reader) Option { + return func(s *CommandHelper) { + s.stdin = stdin + } +} func WithEnv(env ...string) Option { return func(s *CommandHelper) { s.env = append(s.env, env...) diff --git a/agent/utils/files/tar_gz.go b/agent/utils/files/tar_gz.go index e1d4909f4..f1f94396c 100644 --- a/agent/utils/files/tar_gz.go +++ b/agent/utils/files/tar_gz.go @@ -24,11 +24,11 @@ func (t TarGzArchiver) Extract(ctx context.Context, filePath, dstDir string, sec if err := os.MkdirAll(dstDir, 0755); err != nil { return fmt.Errorf("failed to create destination dir: %w", err) } + cmdMgr := cmd.NewCommandMgr(cmd.WithContext(ctx), cmd.WithIgnoreExist1()) if len(secret) != 0 { - return runTarGzDecryptToDir(cmd.NewCommandMgr(cmd.WithIgnoreExist1()), filePath, dstDir, secret, false) - } else { - return runTarGzExtractToDir(cmd.NewCommandMgr(cmd.WithIgnoreExist1()), filePath, dstDir) + return runTarGzDecryptToDir(cmdMgr, filePath, dstDir, secret, false) } + return runTarGzExtractToDir(cmdMgr, filePath, dstDir) } func (t TarGzArchiver) Compress(ctx context.Context, sourcePaths []string, dstFile string, secret string) error { diff --git a/agent/utils/files/zip.go b/agent/utils/files/zip.go index 147546dc5..e620caae6 100644 --- a/agent/utils/files/zip.go +++ b/agent/utils/files/zip.go @@ -4,7 +4,6 @@ import ( "context" "fmt" "path" - "strings" "time" "github.com/1Panel-dev/1Panel/agent/constant" @@ -43,7 +42,8 @@ func (z ZipArchiver) Compress(ctx context.Context, sourcePaths []string, dstFile relativePaths[i] = path.Base(sp) } cmdMgr := cmd.NewCommandMgr(cmd.WithWorkDir(baseDir), cmd.WithContext(ctx)) - if err = cmdMgr.Run("zip", "-qr", tmpFile, strings.Join(relativePaths, " ")); err != nil { + args := append([]string{"-qr", tmpFile}, relativePaths...) + if err = cmdMgr.Run("zip", args...); err != nil { return err } if err = op.Mv(tmpFile, dstFile); err != nil {