Golang中如何使用变量执行命令

Golang中如何使用变量执行命令 我有一个变量命令,内容类似于“mkdir /root/test”,我想用 exec 命令来执行它。

但我无法使用我的变量,我不明白为什么。

(我尝试这样做)

	cmd := exec.Command(data.Command)
        err := cmd.Run()
	if err != nil {
		return
	}
7 回复

christophberger:

fmt.Println()

fork/exec mkdir /root/camarche: no such file or directory 这个错误

更多关于Golang中如何使用变量执行命令的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


我需要使用动态参数,我在谷歌上看到了这个:

args := []string{"what", "ever", "you", "like"}
cmd := exec.Command(app, args...)

但是我有一个 JSON,我该如何将其转换为 []string 呢?

你好 @Bagou450

在你从 data.Command 创建 cmd 时,data.Command 包含什么内容? err 包含什么内容?

提示:添加 fmt.Println() 来打印这些值,这将有助于更好地理解代码失败的原因。

Bagou450:

fork/exec mkdir /root/camarche: no such file or directory the error

看起来路径 /root/camarche 不存在。请记住,mkdir 只会创建给定路径的最后一个元素。使用 mkdir -d 来创建所有缺失的父目录/祖父目录等。

但是,我有一个 JSON,如何将其转换为字符串?

这取决于你的 JSON 数据结构。通常,encoding/json 包应该包含你所需的一切。如果你的 JSON 数据是一个字符串数组,json.Unmarshal 应该能够直接将此数据读取到一个字符串切片中。

func main() {
    fmt.Println("hello world")
}

我的理解是你有类似这样的结构:

type myData struct {
    // ...
    Command string
    // ...
}

var data = myData{
    // ...
    Command: "fork/exec mkdir /root/camarche"
    // ...
}

并且你想使用 exec.Command 来运行那个命令。是这样吗?如果是的话,你的命令参数中会有包含空格的参数吗?如果没有,你应该可以使用 string.Fields

fields := strings.Fields(data.Command)
cmd := exec.Command(fields[0], fields[1:]...)

如果参数可能包含空格并且会被引号包裹,那么你将需要解析这些参数。搜索之后,看起来有一些包可以为你做这件事,例如 github.com/kballard/go-shellquote,它可以将你的单个字符串分割成所有字段。

在Go中,exec.Command的第一个参数应该是可执行文件的名称,后续参数才是命令的参数。当你传入一个包含完整命令的字符串时,它会被当作单个参数处理,这通常会导致错误。

你需要将命令和参数分开。可以使用strings.Fields来分割字符串:

import (
    "os/exec"
    "strings"
)

func executeCommand(command string) error {
    parts := strings.Fields(command)
    if len(parts) == 0 {
        return nil
    }
    
    cmd := exec.Command(parts[0], parts[1:]...)
    return cmd.Run()
}

// 使用示例
func main() {
    data.Command := "mkdir /root/test"
    err := executeCommand(data.Command)
    if err != nil {
        // 处理错误
    }
}

如果你的命令包含引号或特殊字符,可以考虑使用shbash来执行:

cmd := exec.Command("sh", "-c", data.Command)
err := cmd.Run()

这样可以直接执行包含管道、重定向等复杂命令的字符串。

回到顶部