如何将PowerShell脚本嵌入GO程序以构建一个单一的二进制文件

3

我想将一些powershell脚本嵌入到一个Go二进制文件中。如何将它们嵌入并从GO中执行命令。 目前,我通过运行外部脚本来实现:

out,err := exec.Command("Powershell", "-file" , "C:\\test\\go\\my.ps1").Output()
if err != nil {
     log.Fatal(err)

}

fmt.Printf("Data from powershell script is: %s", out)

我的.ps1文件内容:

[System.Security.Principal.WindowsIdentity]::GetCurrent().Name

我有几个PowerShell脚本,我想将它们添加到我的go二进制文件中。 尝试了一些在互联网上找到的东西,但都失败了。


你可以将文件嵌入到Go二进制文件中,但要将这些文件暴露给主机操作系统,你需要将嵌入的资源复制回文件系统(例如/tmp)- 然后你就可以启动你的 exec.Command - colm.anseo
2个回答

2

嵌入您的资产:

import (
    _ "embed"
)

//go:embed my.ps1
var shellBody []byte

当您需要主机操作系统访问此内容时,通过临时文件将其表面化:

tmp, err := ioutil.TempFile("/tmp", "powershell.*.ps1")
if err != nil {
    log.Fatal(err)
}
defer os.Remove(tmp.Name()) // clean-up when done


f, err := os.OpenFile(tmp.Name(), os.O_WRONLY|os.O_CREATE|os.O_TRUNC, 0644)
if err != nil {
    log.Fatal(err)
}

_, err = f.Write(shellBody)
if err != nil {
    log.Fatal(err)
}

err = f.Close()
if err != nil {
    log.Fatal(err)
}

然后您可以调用Powershell

out, err := exec.Command("Powershell", "-file" , tmp.Name()).Output()
if err != nil {
    log.Fatal(err)
}

有没有办法在不创建和写入临时文件的情况下将嵌入式文件名传递给命令(在这种情况下是PowerShell)? - mj3c
1
很遗憾,嵌入式文件在Go二进制文件中。要将它们提取出来,必须通过Go代码主动提取。 - colm.anseo

1
你可以使用go1.16和embed,应该创建一个单独的文件夹来保存嵌入式文件定义,然后使用另一个函数返回字符串或byte[]文件引用。
package main

import (
    "embed"
    "text/template"
)

var (
    // file.txt resides in a separated folder
    //go:embed file.txt
    myfile string
)

func main() {
    fmt.Printf("File %q\n", myfile)
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接