使用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 world\ngoodbye 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 命令时。
以上就是Golang如何使用os/exec执行系统命令的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号