0

我需要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().

有没有办法使这项工作?

4

1 回答 1

1

您标记了 osquery,所以...也许作为替代方案,不要那样运行osqueryi,它不应该那样使用。

一般建议是根据需要使用osqueryd配置。或者,如果你真的想要单次调用,osqueryi你可以从命令行使用查询来调用它,以 json 格式输出:

osqueryi --json "select 1"
[
  {"1":"1"}
]

osqueryiosqueryd.

于 2020-04-15T02:12:52.070 回答