go 执行shell命令

发布时间 2023-08-07 11:30:40作者: 厚礼蝎

简单案例

package main

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

var (
	ctx = context.Background()
)

func main() {
	cmd := exec.CommandContext(ctx, "ip", "a")
	res, err := cmd.Output()
	if err != nil {
		panic(err)
	}
	fmt.Println(string(res))
}

注意:命令的第一个参数一定是一个可以在bash环境下直接运行的文件,否则,不会成功
例如:这里是把ip a拆开来运行的,而不是写在一起运行

带有管道符的命令

一条命令完成

这里需要借助 bash -c 命令

package main

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

var (
	ctx = context.Background()
)

func main() {
	cmd := exec.CommandContext(ctx, "bash", "-c", "ip a | grep host")
	res, err := cmd.Output()
	if err != nil {
		panic(err)
	}
	fmt.Println(string(res))
}

因为有特殊字符(管道符),所以,这里需要使用 bash -c 来运行

注意:最后一个参数最好是全部命令,除了 bash -c 不要分开写

组合执行

package main

import (
	"bytes"
	"context"
	"fmt"
	"os/exec"
)

var (
	ctx = context.Background()
)

func main() {
	cmd1 := exec.CommandContext(ctx, "bash", "-c", "ip a")

	// 获取标准输出和标准错误输出
	out1, err := cmd1.Output()
	if err != nil {
		panic(err)
	}

	// 构建第二部分命令
	cmd2 := exec.CommandContext(ctx, "grep", " host")
	// 将第一部分的输出转换成bytes.Reader类型,然后传递给第二部分命令的输出
	cmd2.Stdin = bytes.NewReader(out1)
	res, err := cmd2.Output()
	if err != nil {
		panic(err)
	}
	fmt.Println(string(res))
}