Golang中使用exec.Command()执行命令的方法

Golang中使用exec.Command()执行命令的方法 我尝试通过以下代码运行一个命令,该命令读取由IP地址ip指定的远程机器上某个文件的内容(使用给定的用户名和密码凭据),并将其内容重定向到output.txt。但当我运行我的代码时,命令执行失败,提示退出状态1。令人惊讶的是,当我尝试从命令提示符运行相同的命令时,它却可以正常工作。

如果还需要我提供其他信息,请告诉我。

func functionName(psexecPath,ip,username,password string) {
	ipFormat := "\\\\" + ip
	uFlag := "-u"
	pFlag := "-p"
	cmdExe := "cmd"
	cmd := exec.Command(psexecPath, ipFormat, uFlag, username, pFlag, password, cmdExe,  "/C", "type /path/to/somefile.txt", ">", "output.txt")
	var stdout, stderr bytes.Buffer
	cmd.Stdout = &stdout
	cmd.Stderr = &stderr
	err := cmd.Run()
	if err != nil {
		fmt.Println(stderr.String())
		return
	}
	fmt.Println(stdout.String())
	return
}

更多关于Golang中使用exec.Command()执行命令的方法的实战教程也可以访问 https://www.itying.com/category-94-b0.html

2 回复

你不能在 Cmd 中使用重定向操作符。

你需要将调用包装在 shell 解释器中,或者打开一个写入输出文件的文件流,并将其用作命令的标准输出。

更多关于Golang中使用exec.Command()执行命令的方法的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


在Golang中使用exec.Command()执行命令时,重定向符号>在shell中会被解释,但直接通过exec.Command()执行时不会被shell解析。你需要通过cmd/C参数将整个命令作为字符串传递,或者使用shell来执行命令。

以下是修改后的代码示例:

func functionName(psexecPath, ip, username, password string) {
    ipFormat := "\\\\" + ip
    uFlag := "-u"
    pFlag := "-p"
    
    // 方法1:将整个命令作为单个字符串传递给cmd /C
    cmd := exec.Command("cmd", "/C", psexecPath, ipFormat, uFlag, username, pFlag, password, "cmd", "/C", "type /path/to/somefile.txt > output.txt")
    
    // 方法2:使用shell执行(Windows)
    // fullCmd := fmt.Sprintf("%s %s %s %s %s %s cmd /C \"type /path/to/somefile.txt > output.txt\"", 
    //     psexecPath, ipFormat, uFlag, username, pFlag, password)
    // cmd := exec.Command("cmd", "/C", fullCmd)
    
    var stdout, stderr bytes.Buffer
    cmd.Stdout = &stdout
    cmd.Stderr = &stderr
    
    err := cmd.Run()
    if err != nil {
        fmt.Printf("命令执行失败: %v\n", err)
        fmt.Printf("标准错误输出: %s\n", stderr.String())
        return
    }
    
    fmt.Printf("标准输出: %s\n", stdout.String())
}

或者,如果你需要捕获命令输出而不是重定向到文件,可以这样处理:

func functionName(psexecPath, ip, username, password string) {
    ipFormat := "\\\\" + ip
    uFlag := "-u"
    pFlag := "-p"
    
    // 直接执行type命令并捕获输出
    cmd := exec.Command(psexecPath, ipFormat, uFlag, username, pFlag, password, "cmd", "/C", "type /path/to/somefile.txt")
    
    var stdout, stderr bytes.Buffer
    cmd.Stdout = &stdout
    cmd.Stderr = &stderr
    
    err := cmd.Run()
    if err != nil {
        fmt.Printf("命令执行失败: %v\n", err)
        fmt.Printf("标准错误输出: %s\n", stderr.String())
        return
    }
    
    // 将输出写入本地文件
    outputContent := stdout.String()
    err = os.WriteFile("output.txt", []byte(outputContent), 0644)
    if err != nil {
        fmt.Printf("写入文件失败: %v\n", err)
        return
    }
    
    fmt.Printf("文件内容已保存到output.txt\n")
}

关键点是:重定向符号>需要由shell解释,所以你需要确保整个重定向命令作为一个完整的字符串传递给shell(通过cmd /C)。

回到顶部