如何在Go语言程序中执行Ubuntu终端命令?
在Ubuntu的Go程序中执行终端命令
当然可以!在Go语言里执行Ubuntu终端命令是非常常见的操作,完全不需要额外安装依赖,靠Go标准库的os/exec包就能搞定。我给你分享几种实用的场景和代码示例:
1. 基础执行命令(不捕获输出)
如果只是想执行一个命令,比如mkdir或者rm,不需要获取它的输出,直接用Run()方法就行:
package main import ( "log" "os/exec" ) func main() { // 定义要执行的命令,第一个参数是命令名,后面是可选参数 cmd := exec.Command("mkdir", "new_project_folder") // 执行命令 err := cmd.Run() if err != nil { log.Fatalf("命令执行失败: %v", err) } }
2. 捕获命令的标准输出
如果需要获取命令执行后的结果(比如df -h查看磁盘使用情况),可以用Output()方法,它会返回命令的标准输出字节流:
package main import ( "fmt" "log" "os/exec" ) func main() { // 执行带参数的磁盘查看命令 cmd := exec.Command("df", "-h") // 获取输出 output, err := cmd.Output() if err != nil { log.Fatalf("命令执行失败: %v", err) } // 将字节数组转为字符串并打印 fmt.Println("磁盘使用情况:\n", string(output)) }
3. 执行Shell内置命令或组合命令
有些命令是Shell的内置命令(比如cd、echo),或者需要用管道、&&这类Shell语法组合命令,这时候需要通过bash -c来执行:
package main import ( "fmt" "log" "os/exec" ) func main() { // 执行组合命令:查看当前目录下的txt文件并统计数量 cmd := exec.Command("bash", "-c", "ls *.txt | wc -l") // CombinedOutput会同时捕获标准输出和错误输出,方便排查问题 output, err := cmd.CombinedOutput() if err != nil { log.Fatalf("命令执行失败: %v\n错误输出: %s", err, output) } fmt.Println("当前目录下的txt文件数量:", string(output)) }
几个重要注意事项
- 避免命令注入:永远不要直接把用户输入拼接成命令字符串,一定要用
exec.Command的参数列表形式(比如exec.Command("echo", userInput)而不是exec.Command("bash", "-c", "echo "+userInput)),防止恶意输入触发危险命令。 - 环境变量控制:如果需要自定义命令执行的环境变量,可以修改
cmd.Env字段,比如cmd.Env = append(os.Environ(), "MY_VAR=custom_value")。 - 错误处理:命令执行失败时,
err会包含详细的错误信息,结合CombinedOutput能看到命令本身的错误输出,有助于快速定位问题。
内容的提问来源于stack exchange,提问作者Coding4Life
相关产品推荐
相关产品推荐

