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

2sbarzqh  于 2022-12-16  发布在  Go
关注(0)|答案(3)|浏览(212)

我正在交叉编译一个Go语言的程序,这个程序将执行bash脚本。是否可以将bash脚本嵌入到二进制文件中?
我参考了:Golang serve static files from memory
不确定这是否适用于执行bash脚本。我在这里错过了什么吗?一些澄清或指针将是非常有帮助的,谢谢!

wbgh16ku

wbgh16ku1#

由于bash可以执行来自stdin的脚本,因此只需通过command.Stdin将脚本发送到bash命令。
一个没有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))
}

随动1.16 x 1米5英寸(x 1米0英寸):

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))
}
奖金

使用-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))
}

Playground:https://go.dev/play/p/T1lMSrXcOIL

bwitn5fc

bwitn5fc2#

实际上,你可以直接与Go语言的系统shell接口。根据bash脚本的内容,你可以把所有的东西都转换成Go语言。例如,处理文件、提取归档文件、输出文本、请求用户输入、下载文件等等,都可以在Go语言中本地完成。对于任何你绝对需要shell来完成的事情,你都可以使用golang.org/pkg/os/exec
我写了一个代码片段,演示了一个非常简单的Go语言命令shell。基本上,它通过管道在用户和shell之间传输输入、输出和错误。它可以交互使用,也可以直接运行大多数shell命令。我在这里提到它主要是为了演示Go语言的操作系统功能。看看这个:github.com/lee8oi/goshell.go

66bbxpm5

66bbxpm53#

您是否尝试过将流数据(根据参考资料go-bindata提供了一个返回[]byte的函数)写入临时文件?
参见:http://golang.org/pkg/io/ioutil/#TempFile
然后可以使用系统调用执行它
http://golang.org/pkg/syscall/#Exec
其中第一个参数必须是shell。

相关问题