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

在Go语言中,os/exec 包是执行系统命令的标准方式。它允许你启动外部进程、传入参数、捕获输出,甚至控制输入输出流。下面介绍几种常见用法,帮助你正确使用 os/exec 执行系统命令。
执行简单命令并等待完成
使用 exec.Command 创建一个命令对象,然后调用 Run() 方法执行并等待结束。
package mainimport ( "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 mainimport ( "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 mainimport ( "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 命令时。
以上就是Golang如何使用os/exec执行系统命令的详细内容,更多请关注创想鸟其它相关文章!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1417168.html
微信扫一扫
支付宝扫一扫