运行 一个进程搞砸了 shell

Running a process messes up shell

在我 运行 我的应用程序之前,我需要 运行 一个名为 osqueryi 的进程,并在关闭时终止该进程。 (这是一种可以查询的守护进程。我需要它 运行ning 才能让我的应用程序运行)。

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 就像一个交互式 shell。它需要传递 os.Stdin,因为显然它使用 isatty。如果我不这样做,它就不会 运行。所以我需要开始这个过程,因为我需要查询它,但我不需要向它写入任何输入,因为我的想法是使用 go 模块 osquery-go 从我的应用程序发出查询...

我需要在 go 例程中调用它,否则我无法将日志输出写入屏幕...

无论如何,它还挺管用的。但是,当应用程序终止时,我的终端就乱七八糟了:我的提示行不见了(看不到我输入的内容)。我猜,因为我正在为其分配 STDIN 但我从不写入它,同时通过 fmt.Println().

将输出写入 STDOUT

有没有办法让它工作?

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

一般建议使用 osqueryd 和您喜欢的配置。或者,如果您真的想单次调用 osqueryi,您可以通过命令行查询来调用它,在 json:

中输出
osqueryi --json "select 1"
[
  {"1":"1"}
]

osqueryiosqueryd 并不相同。