0

0

如何在 Go 二进制文件中嵌入并执行 Bash 脚本

霞舞

霞舞

发布时间:2026-01-05 23:53:01

|

686人浏览过

|

来源于php中文网

原创

如何在 Go 二进制文件中嵌入并执行 Bash 脚本

go 1.16+ 支持 `embed` 包,可将 bash 脚本以字符串形式编译进二进制;配合 `exec.command("bash")` 并设置 `stdin`,即可直接执行,无需外部文件依赖,完美支持交叉编译。

在 Go 应用中动态执行 Shell 脚本是常见需求(如初始化环境、调试辅助、CI 工具封装等),但传统方式需分发脚本文件,破坏单一二进制优势,且易因路径或权限问题失败。Go 1.16 引入的 embed 包为此提供了优雅解法:将脚本内容静态嵌入编译后的二进制中,并通过标准输入(stdin)交由 bash 或 sh 解释执行

✅ 基础实现:嵌入 + 执行

只需两步:

  1. 使用 //go:embed 指令声明脚本文件(如 script.sh);
  2. 创建 exec.Command("bash"),并将嵌入的脚本内容作为 strings.NewReader(script) 赋给 c.Stdin。
package main

import (
    "embed"
    "fmt"
    "os/exec"
    "strings"
)

//go:embed script.sh
var script string // 类型为 string,自动读取文件 UTF-8 内容

func main() {
    cmd := exec.Command("bash")
    cmd.Stdin = strings.NewReader(script)

    output, err := cmd.Output()
    if err != nil {
        fmt.Printf("执行失败: %v\n", err)
        return
    }
    fmt.Println(string(output))
}

⚠️ 注意事项:

  • embed 仅支持 string 和 []byte 类型变量;若需二进制脚本(如含非 UTF-8 字符),请改用 []byte + bytes.NewReader();
  • 确保目标系统已安装 bash(或改用 sh 提高兼容性);
  • 脚本中使用 $0, $1, $@ 等参数时,需显式传参(见下文“带参执行”);
  • script.sh 必须位于当前包目录或子目录中,且不能是隐藏文件(以 . 开头)或 testdata/ 目录下的文件。

? 进阶技巧:向嵌入脚本传递参数

Bash 支持 -s 标志从 stdin 读取脚本,并将后续参数作为 , , … $@ 传入:

启科PHP淘宝客系统
启科PHP淘宝客系统

1、请上传下载到的淘宝客系统安装包并上传到空间根目录中进行解压,解压后将网站文件移动到根目录的位置,然后访问 /install 进行安装。您也可以在本地解压,并以二进制方式将程序上传至您的网站空间。 2、同意启科网络电子商务系统安装协议进入下一步。 3、如果系统检测环境通过,则会提示输入您的数据库服务器地址(一般为本机,即127.0.0.1或者localhost)、数据库账号、数据库密码、数据库名

下载
package main

import (
    "fmt"
    "os/exec"
    "strings"
)

func main() {
    // -s: 从 stdin 读脚本;-: 占位符(表示脚本结束位置);后续为 $1, $2...
    cmd := exec.Command("bash", "-s", "-", "hello", "world")

    cmd.Stdin = strings.NewReader(`
echo "参数个数: $#"
echo "第一个参数: $1"
echo "第二个参数: $2"
echo "全部参数: $@"
`)

    out, err := cmd.Output()
    if err != nil {
        fmt.Printf("执行出错: %v\n", err)
        return
    }
    fmt.Print(string(out))
}

输出示例:

参数个数: 2
第一个参数: hello
第二个参数: world
全部参数: hello world

? 验证与最佳实践

  • 交叉编译安全:embed 在构建时完成内容注入,不依赖运行时文件系统,GOOS=linux GOARCH=arm64 go build 可生成纯静态 ARM64 二进制;
  • 调试建议:开发期可用 fmt.Printf("嵌入脚本:\n%s\n", script) 输出验证内容是否正确加载;
  • 安全提醒:避免拼接用户输入到嵌入脚本中(防止命令注入),如需动态逻辑,请改用 Go 原生实现或严格参数化调用;
  • 替代方案对比:相比 text/template 渲染或 os.ReadFile,embed 零 I/O、零依赖、启动即用,是嵌入式/CLI 工具的首选。

通过 embed + exec 组合,你既能享受 Go 单体二进制的部署便利,又能复用成熟的 Shell 生态——无需妥协,开箱即用。

相关专题

更多
string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

314

2023.08.02

printf用法大全
printf用法大全

php中文网为大家提供printf用法大全,以及其他printf函数的相关文章、相关下载资源以及各种相关课程,供大家免费下载体验。

72

2023.06.20

fprintf和printf的区别
fprintf和printf的区别

fprintf和printf的区别在于输出的目标不同,printf输出到标准输出流,而fprintf输出到指定的文件流。根据需要选择合适的函数来进行输出操作。更多关于fprintf和printf的相关文章详情请看本专题下面的文章。php中文网欢迎大家前来学习。

279

2023.11.28

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

253

2023.08.03

js截取字符串的方法
js截取字符串的方法

js截取字符串的方法有substring()方法、substr()方法、slice()方法、split()方法和slice()方法。本专题为大家提供字符串相关的文章、下载、课程内容,供大家免费下载体验。

206

2023.09.04

java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

1458

2023.10.24

字符串介绍
字符串介绍

字符串是一种数据类型,它可以是任何文本,包括字母、数字、符号等。字符串可以由不同的字符组成,例如空格、标点符号、数字等。在编程中,字符串通常用引号括起来,如单引号、双引号或反引号。想了解更多字符串的相关内容,可以阅读本专题下面的文章。

612

2023.11.24

java读取文件转成字符串的方法
java读取文件转成字符串的方法

Java8引入了新的文件I/O API,使用java.nio.file.Files类读取文件内容更加方便。对于较旧版本的Java,可以使用java.io.FileReader和java.io.BufferedReader来读取文件。在这些方法中,你需要将文件路径替换为你的实际文件路径,并且可能需要处理可能的IOException异常。想了解更多java的相关内容,可以阅读本专题下面的文章。

547

2024.03.22

免费看漫画app合集_2026免费漫画app排行榜入口
免费看漫画app合集_2026免费漫画app排行榜入口

2026年免费漫画APP合集来啦!为你精心整理最新免费漫画APP排行榜入口,涵盖漫蛙漫画、香香漫画、包子漫画等热门神器,海量正版国漫、日漫、韩漫资源全免费阅读,无需付费解锁章节!高清全彩画质、每日极速更新,支持离线下载、智能推荐、条漫阅读模式,热血、恋爱、悬疑、古风、搞笑等题材应有尽有。无论你是追新番老粉还是小白漫迷,这里都能让你一站式追漫到爽,告别广告干扰和会员套路!赶紧点击入口下载体验,开启2026无限免费漫画之旅吧!

13

2026.01.07

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PostgreSQL 教程
PostgreSQL 教程

共48课时 | 6.7万人学习

Git 教程
Git 教程

共21课时 | 2.5万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号