как встроить скрипт powershell в программу GO для сборки 1 двоичного файла

#powershell #go #embed #script

#powershell #Вперед #Внедрить #скрипт

Вопрос:

Мне нравится встраивать некоторые сценарии powershell в 1 двоичный файл 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)
 

//

содержимое my.ps1

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

//

У меня есть еще несколько сценариев powershell, я хотел бы добавить сценарии powershell в свой двоичный файл go. Попробовал несколько вещей, которые я нашел в Интернете, но потерпел неудачу.

Комментарии:

1. Вы можете встраивать файлы в двоичный файл Go, но чтобы предоставить их хост-ОС, вам нужно будет скопировать встроенные ресурсы обратно в файловую систему (например /tmp ) — тогда вы могли бы инициировать свой exec.Command .

Ответ №1:

Внедрите свой ресурс:

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

Ответ №2:

Вы можете использовать go1.16 и embed, вам следует создать отдельную папку для сохранения определений файлов 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 %qn", myfile)
}