#linux #shell #file #amazon-ec2 #command-line
Вопрос:
Контекст: У меня есть программа (движок правил go-sigma от Маркуса Конта) на моем экземпляре EC2, которая работает с файлом журнала и выдает некоторые выходные данные на экран.
Команда, используемая для запуска этой программы, является ./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
файл пуст и не захватил выходные данные команды, вызывающей механизм правил.
Комментарии:
1. можно также попробовать
--sigma-stats-format=human --sigma-stats-file output.txt
или--sigma-emit-file output.txt
2. Да, механизм правил встроен с некоторыми приятными функциями, но я задал этот вопрос в основном из любопытства относительно того, почему перенаправление файлов не работало.
3. @PrithviBoinpally : Возможно, ваш механизм правил пишет не в stdout, а либо в stderr, либо непосредственно в терминал?
4. Да, это был ответ на этот вопрос
Ответ №1:
Возможно, вывод, который вы хотите получить, приводит к стандартной ошибке, а не к стандартному выводу. Попробуйте использовать 2>
вместо >
перенаправления stderr.
Комментарии:
1. Вот и все! Не могу поверить, что это было так просто исправить. Как узнать, куда программа направляет свой вывод? Например, как я узнаю, что моя программа переходит к стандартной ошибке? И можно ли изменить это поведение?
2. Это зависит от решения разработчика программы — соглашение заключается в том, чтобы отправить ожидаемый вывод программы в stdout и дополнительную информацию/ошибки в stderr. например —
tcpdump
записывает захваченные пакетыstdout
, но сводку и заголовок в stderr. Вы также можете использоватьamp;>
его для перенаправления как stderr, так и stdout одновременно.2>
просто означает, что откройте целевой файл под номером fd 2 (который переопределяет стандартный формат). Либо используйтеamp;>, если вы не хотите получать оба вывода, либо проверьте с помощью 1>>/dev/null, если вы все еще получаете вывод на консоли (который будет stderr)