使用os/exec包执行系统命令,通过exec.Command创建命令对象并调用Run()等待完成;2. 用Output()获取命令输出;3. 手动设置Stdin、Stdout、Stderr以控制输入输出流;4. 设置Env字段传递环境变量;5. 避免拼接用户输入防止命令注入。

在go语言中,os/exec 包是执行系统命令的标准方式。它允许你启动外部进程、传入参数、捕获输出,甚至控制输入输出流。下面介绍几种常见用法,帮助你正确使用 os/exec 执行系统命令。
执行简单命令并等待完成
使用 exec.Command 创建一个命令对象,然后调用 Run() 方法执行并等待结束。
package main import ( "log" "os/exec" ) func main() { cmd := exec.Command("ls", "-l") err := cmd.Run() if err != nil { log.Fatalf("命令执行失败: %v", err) } }
说明: Run() 会阻塞直到命令执行完成。如果命令返回非零退出码,Run() 会返回错误。
获取命令的输出结果
很多场景下你需要获取命令的输出内容,可以使用 Output() 方法。
立即学习“go语言免费学习笔记(深入)”;
package main import ( "fmt" "log" "os/exec" ) func main() { cmd := exec.Command("echo", "Hello, Go!") output, err := cmd.Output() if err != nil { log.Fatalf("命令出错: %v", err) } fmt.Printf("输出: %s", output) }
说明: Output() 自动捕获标准输出,但不会打印到终端。如果命令出错(如命令不存在或返回非零状态),也会返回错误。
处理标准错误和输入流
当需要更细粒度控制时,比如重定向输入、捕获错误输出,可以手动设置 Stdin、Stdout 和 Stderr。
package main import ( "bytes" "log" "os/exec" ) func main() { cmd := exec.Command("grep", "hello") // 提供输入 cmd.Stdin = bytes.NewBufferString("hello worldngoodbye world") // 捕获输出和错误 var stdout, stderr bytes.Buffer cmd.Stdout = &stdout cmd.Stderr = &stderr err := cmd.Run() if err != nil { log.Printf("命令失败: %v", err) } log.Printf("标准输出: %s", stdout.String()) log.Printf("标准错误: %s", stderr.String()) }
说明: 这种方式适合需要模拟用户输入或分离错误信息的场景,例如自动化测试或交互式命令。
执行带环境变量的命令
你可以为命令设置独立的环境变量。
cmd := exec.Command("printenv", "MY_VAR") cmd.Env = []string{"MY_VAR=hello_from_go"} output, err := cmd.Output() if err != nil { log.Fatal(err) } fmt.Printf("%s", output) // 输出: hello_from_go
说明: 如果不设置 Env,子进程会继承父进程的环境变量。设置后需显式包含所需的所有变量。
基本上就这些。掌握 Command、Run、Output 和流控制,就能应对大多数系统命令调用需求。注意避免直接拼接用户输入以防注入风险,特别是在执行 shell 命令时。


