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
你不能在 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)。

