
本文介绍如何使用 Go 语言构建一个简易命令行工具,接收用户输入的命令及其参数,并在系统终端中安全执行,替代 C 语言中的 system() 调用。
本文介绍如何使用 go 语言构建一个简易命令行工具,接收用户输入的命令及其参数,并在系统终端中安全执行,替代 c 语言中的 system() 调用。
Go 标准库提供了强大且安全的进程管理能力,os/exec 包正是实现此类功能的核心。与 C 中直接拼接字符串后调用 system() 不同,Go 的 exec.Command() 会将命令名与参数分离传递,从根本上避免 shell 注入风险(例如用户输入 ; rm -rf / 不会被解释为多条 shell 命令)。
以下是一个完整、健壮的实现:
package main
import (
"fmt"
"os"
"os/exec"
"syscall"
)
func main() {
if len(os.Args) <p>✅ <strong>关键优势说明:</strong> </p>
-
安全性高:
exec.Command(name, args...)不经过 shell 解析,杜绝命令注入; -
参数清晰:
os.Args[2:]...使用展开语法,自动将每个参数作为独立字符串传递; -
I/O 透传:显式设置
Stdin/Stdout/Stderr,使子命令行为与直接在终端运行完全一致; -
退出码透传:通过
exec.ExitError捕获并还原子进程退出状态,符合 Unix 工具规范。
⚠️ 注意事项:
- 不要使用
exec.Command("sh", "-c", userInput)来模拟 shell 功能——这会重新引入安全风险; - 若需支持管道、重定向等 shell 特性,应改用
sh或bash显式调用,并严格校验输入(不推荐用于不可信输入); - 在生产环境建议添加超时控制(如
cmd.Context()配合time.AfterFunc),防止命令挂起。
该方案简洁、安全、符合 Go 的惯用风格,是替代 C 中 system() 的现代首选实践。










