运行我的应用程序之前,我需要运行一个名为osqueryi
的进程,并且在关机时,该进程将被杀死。 (它是一种可以查询的守护程序。我需要运行它才能使我的应用正常工作。)>
func bootOsqueryi(strcmd string) { cwd, err := os.Getwd() if err != nil { panic(err) } pa := os.ProcAttr{ Files: []*os.File{os.Stdin, os.Stdout, os.Stderr}, Dir: cwd, } path, err := exec.LookPath(strcmd) if err != nil { handleError(err) return } osqueryi, err := os.StartProcess(path, []string{strcmd}, &pa) if err != nil { handleError(err) return } osqueryi.Wait() }
我从眼镜蛇
PersistentPreRun
钩子这样称呼它,例如:go bootOsqueryi("osqueryi")
。
在PersistentPostRun
钩子中,我将其关闭:
func shutdown() { if osqueryi != nil { osqueryi.Kill() } }
Osqueryi
就像一个交互式外壳。它需要传递os.Stdin
,因为显然它使用了isatty
。如果我不这样做,它将无法运行。因此,我需要启动此过程,因为我需要对其进行查询,但是由于该想法是使用go模块osquery-go
从我的应用中发出查询,因此我不需要向其输入任何内容...
我需要在go
例程中调用它,因为否则我无法将日志输出写入屏幕...
无论如何,它都很好。但是,当应用终止时,我的终端混乱了:我的提示行丢失了(看不到我键入的内容)。我猜是因为我正在为其分配STDIN,但是我从未写过它,同时也没有通过fmt.Println()
将输出写到STDOUT。
有没有办法使这项工作有效?
我需要先运行一个名为osqueryi的进程,然后再运行我的应用程序,并在关机时将其杀死。 (它是一种可以查询的守护程序。为了使我的应用能够运行,我需要运行该守护程序...
您标记了osquery,所以...也许作为替代,不要那样运行osqueryi
,这并不是要那样使用。
一般建议根据需要将osqueryd
与配置一起使用。或者,如果您真的想单次调用osqueryi
,则可以在命令行中通过查询来调用它,并在json中输出: