簡體   English   中英

Go:在二進制中嵌入 bash 腳本

[英]Go: embed bash script in binary

我正在嘗試交叉編譯一個將執行 bash 腳本的 Go 程序。 是否可以在二進制文件中嵌入 bash 腳本?

我參考了: Golang 從內存中提供靜態文件

不確定這是否適用於執行 bash 腳本。 我在這里錯過了什么嗎? 一些澄清或指示將非常有幫助,謝謝!

由於bash可以從stdin執行腳本,您只需通過command.Stdin將腳本發送到bash命令。

一個沒有 go embed的例子:

package main

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

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

func main() {
    c := exec.Command("bash")
    var buf = new(bytes.Buffer)
    buf.WriteString(script)
    c.Stdin = buf

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

使用 go 1.16 embedhttps://golang.org/pkg/embed/ ):

package main

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

//go:embed script.sh
var script string

func main() {
    c := exec.Command("bash")
    var buf = new(bytes.Buffer)
    buf.WriteString(script)
    c.Stdin = buf

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

你實際上可以直接與 Go 中的系統 shell 交互。 根據您的 bash 腳本中的內容,您可能可以完全轉換所有內容。 例如,處理文件、提取檔案、輸出文本、請求用戶輸入、下載文件等等都可以在 Go 中本地完成。 對於任何你絕對需要 shell 的東西,你總是可以使用golang.org/pkg/os/exec

我寫了一個片段來演示一個非常簡單的基於 Go 的命令 shell。 基本上它在用戶和外殼之間傳輸輸入、輸出和錯誤。 它可以交互使用或直接運行大多數 shell 命令。 我在這里提到它主要是為了展示 Go 的操作系統功能。 查看: github.com/lee8oi/goshell.go

您是否嘗試將流數據(根據參考 go-bindata 提供了一個返回 []byte 的函數)寫入臨時文件?

見: http : //golang.org/pkg/io/ioutil/#TempFile

然后您可以使用系統調用執行它

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

其中第一個參數需要是一個 shell。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM