go中提供了os/exec包使用Command函数可以完成一些调用命令行的操作。因为系统的不同,调用的参数会有点些不一样。

  • linux中使用使用为 exec.Command("/bin/bash","-c","ls")
  • windows中使用使用为 exec.Command("cmd","/c","ls")

其他的创建执行都是一样的。

我们可以封装一个函数,输入需要执行的命令,输入返回结果

import (
    "bufio"
    "fmt"
    "os/exec"
)

func Command(arg ...string) (result string) {
	name := "/bin/bash"
	c := "-c"
	// 根据系统设定不同的命令name
	if runtime.GOOS == "windows" {
		name = "cmd"
		c = "/C"
	}
	arg = append([]string{c}, arg...)
	cmd := exec.Command(name, arg...)

	//创建获取命令输出管道
	stdout, err := cmd.StdoutPipe()
	if err != nil {
		log.Error("Error:can not obtain stdout pipe for command:%s\n", err)
		return
	}

	//执行命令
	if err := cmd.Start(); err != nil {
		log.Error("Error:The command is err,", err)
		return
	}

	//读取所有输出
	bytes, err := ioutil.ReadAll(stdout)
	if err != nil {
		log.Error("ReadAll Stdout:", err.Error())
		return
	}

	if err := cmd.Wait(); err != nil {
		log.Error("wait:", err.Error())
		return
	}

	result = string(bytes)
	return
}

调用测试

package main

func main() {
	result := Command("ls")
        fmt.Println(result)

	result := Command("df","-h")
        fmt.Println(result)

	result := Command("df -h")
        fmt.Println(result)
}