Go:在二进制文件中嵌入 bash 脚本

use*_*985 8 bash go

我正在尝试交叉编译一个将执行 bash 脚本的 Go 程序。是否可以将 bash 脚本嵌入到二进制文件中?

我引用过: Golang从内存中提供静态文件

但不确定这是否适用于执行 bash 脚本。我在这里错过了什么吗?一些澄清或指示将会非常有帮助,谢谢!

Nin*_*ham 7

由于bash可以从 执行脚本,因此您只需通过stdin发送脚本到命令。bashcommand.Stdin

一个没有 go 的例子embed

package main

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

var script = `
echo $PWD
pwd
echo "-----------------------------------"
# print process
ps aux | grep code
`

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

    b, e := c.Output()
    if e != nil {
        fmt.Println(e)
    }
    fmt.Println(string(b))
}
Run Code Online (Sandbox Code Playgroud)

对于 go 1.16 embed( https://golang.org/pkg/embed/ ):

package main

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

//go:embed script.sh
var script string

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

    b, e := c.Output()
    if e != nil {
        fmt.Println(e)
    }
    fmt.Println(string(b))
}

Run Code Online (Sandbox Code Playgroud)

奖金

使用 向脚本传递参数-s -

以下示例将传递-la /etc给脚本。

package main

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

func main() {
    // pass parameters to your script as a safe way.
    c := exec.Command("sh", "-s", "-", "-la", "/etc")

    // use $1, $2, ... $@ as usual
    c.Stdin = strings.NewReader(`
    echo $@
    ls $1 "$2"
    `)

    b, e := c.Output()
    if e != nil {
        fmt.Println(e)
    }
    fmt.Println(string(b))
}

Run Code Online (Sandbox Code Playgroud)

游乐场:https://go.dev/play/p/T1lMSrXcOIL


小智 -1

您是否尝试将流数据(根据参考 go-bindata 提供了一个返回 []byte 的函数)写入临时文件?

请参阅: http: //golang.org/pkg/io/ioutil/#TempFile

然后你可以使用系统调用来执行它

http://golang.org/pkg/syscall/#Exec

其中第一个参数必须是 shell。