【问题标题】:Why doesn't the Linux redirection operator capture the output of my command?为什么 Linux 重定向运算符不捕获我的命令的输出?
【发布时间】:2021-09-22 22:02:02
【问题描述】:

上下文:我的 EC2 实例上有一个程序(Markus Kont 的 go-sigma-rule-engine),它针对日志文件运行并在屏幕上产生一些输出。

用来运行这个程序的命令是./gsre/go-sigma-rule-engine run --rules-dir ./gsre/rules/ --sigma-input ./logs/exampleLog.json

程序产生以下形式的输出:

INFO[2021-09-22T21:51:06Z] MATCH at offset 0 : [{[]  Example Activity Found}]   
INFO[2021-09-22T21:51:06Z] All workers exited, waiting on loggers to finish   
INFO[2021-09-22T21:51:06Z] Stats logger done   
INFO[2021-09-22T21:51:06Z] Done

目标:我想捕获此输出并将其存储在文件中。

尝试的解决方案:我使用重定向运算符来捕获输出,如下所示:
./gsre/go-sigma-rule-engine run --rules-dir ./gsre/rules/ --sigma-input ./logs/exampleLog.json > output.txt

问题:output.txt 文件为空,未捕获调用规则引擎的命令的输出。

【问题讨论】:

  • 也可以试试--sigma-stats-format=human --sigma-stats-file output.txt--sigma-emit-file output.txt
  • 是的,规则引擎内置了一些不错的功能,但我问这个问题主要是出于好奇文件重定向为什么不起作用。
  • @PrithviBoinpally :也许您的规则引擎不会写入标准输出,而是写入标准错误或直接写入终端?
  • 是的,这就是这个问题的答案

标签: linux shell file amazon-ec2 command-line


【解决方案1】:

也许您要捕获的输出是标准错误而不是标准输出。尝试使用2> 而不是> 来重定向stderr。

【讨论】:

  • 做到了!不敢相信这是一个如此简单的修复。如何知道程序将其输出指向何处?例如。我怎么知道我的程序是否进入标准错误?这种行为是否可以修改?
  • 这取决于程序的开发人员决定 - 约定是将预期的程序输出发送到标准输出,并将额外的信息/错误发送到标准错误。例如 - tcpdump 将捕获的数据包写入stdout,但将摘要和标头写入 stderr。您还可以使用&> 同时重定向stderr 和stdout。 2> 仅表示以 fd 编号 2 的形式打开目标文件(它会覆盖默认的 stderr)。如果您不想同时接收两个输出,请使用 &> 或使用 1>/dev/null 进行检查,如果您仍然在控制台上收到输出(将是标准错误)
猜你喜欢
  • 2021-03-28
  • 2018-07-22
  • 1970-01-01
  • 2016-07-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多