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