在运行我的应用程序之前,我需要运行一个名为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。有没有办法使这项工作?
最佳答案
您标记了osquery,所以...也许作为一种选择,不要那样运行osqueryi
,这并不是要那样使用。
通常的建议是根据需要在配置中使用osqueryd
。或者,如果您确实要单次调用osqueryi
,则可以在命令行中通过查询来调用它,并在json中输出:
osqueryi --json "select 1"
[
{"1":"1"}
]
osqueryi
与osqueryd
并不完全相同。关于shell - 运行进程弄乱了 shell ,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/61219446/