Используя /proc/self/fd
, вы можете увидеть, находитесь ли вы в конвейере, а также идентификатор канала. Если вы выполните итерацию по /proc/\*/fd
в поисках соответствующего канала, вы сможете найти PID другого конца канала. С PID вы можете затем прочитать /proc/$PID/cmdline
, а также повторить процесс на его файловых дескрипторах, чтобы найти, во что он передан.
$ cat | cat | cat &
$ ps
PID TTY TIME CMD
6942 pts/16 00:00:00 cat
6943 pts/16 00:00:00 cat
6944 pts/16 00:00:00 cat
7201 pts/16 00:00:00 ps
20925 pts/16 00:00:00 bash
$ ls -l /proc/6942/fd
lrwx------. 1 tim tim 64 Jul 24 19:59 0 -> /dev/pts/16
l-wx------. 1 tim tim 64 Jul 24 19:59 1 -> 'pipe:[49581130]'
lrwx------. 1 tim tim 64 Jul 24 19:59 2 -> /dev/pts/16
$ ls -l /proc/6943/fd
lr-x------. 1 tim tim 64 Jul 24 19:59 0 -> 'pipe:[49581130]'
l-wx------. 1 tim tim 64 Jul 24 19:59 1 -> 'pipe:[49581132]'
lrwx------. 1 tim tim 64 Jul 24 19:59 2 -> /dev/pts/16
$ ls -l /proc/6944/fd
lr-x------. 1 tim tim 64 Jul 24 19:59 0 -> 'pipe:[49581132]'
lrwx------. 1 tim tim 64 Jul 24 19:59 1 -> /dev/pts/16
lrwx------. 1 tim tim 64 Jul 24 19:59 2 -> /dev/pts/16
Кроме того, если вам повезет, разные команды в конвейере получат последовательные идентификаторы PID, что немного упростит задачу.
На самом деле у меня нет сценария для этого, но я доказал концепцию.
Вы можете использовать следующий пользовательский декодер для извлечения всех полей:
<decoder name="log1">
<prematch>^\d\d.\d\d.\d\d\d\d \d\d:\d\d:\d\d.\d\d\d [\d+]\s+\w+\s+\w+\s+- </prematch>
<regex>^(\d\d.\d\d.\d\d\d\d \d\d:\d\d:\d\d.\d\d\d) [(\d+)]\s+(\w+)\s+(\w+)\s+-\s+(\.+):\s+(\S+),(\S+),(\S+),(\S+),(\S+),(\S+),(\S+),(\S+)</regex>
<order>decoded.date,decoded.pid,decoded.type,decoded.source,decoded.action,field1,field2,field3,field4,field5,field6,field7,field8</order>
</decoder>
Где указанные вами поля извлекаются как decoded.date
, decoded.pid
, decoded.type
, field4
, field6
и field8
соответственно. Если вы не хотите извлекать другие поля, вы можете удалить их скобки в теге <regex>
и их имена из тега <order>
.
Результат запуска вашего журнала с помощью утилиты wazuh-logtest
после настройки этого декодера в /var/ossec/etc/decoders/local_decoders.xml
::
**Phase 1: Completed pre-decoding.
full event: '14.07.2021 12:11:31.801 [25760] info MainForm - Database(s) loaded: CA_2021,beforetest,FL_2,FL_Jan_2021,jhon,DC_City_Jan_2021,Statetest,Benchmark_2021'
**Phase 2: Completed decoding.
name: 'log1'
decoded.action: ' Database(s) loaded'
decoded.date: '14.07.2021 12:11:31.801'
decoded.pid: '25760'
decoded.source: 'MainForm'
decoded.type: 'info'
field1: 'CA_2021'
field2: 'beforetest'
field3: 'FL_2'
field4: 'FL_Jan_2021'
field5: 'jhon'
field6: 'DC_City_Jan_2021'
field7: 'Statetest'
field8: 'Benchmark_2021'