Назад | Перейти на главную страницу

Как захватить UDP-трафик, чтобы его можно было передать в grep

Я пытаюсь перехватить UDP-трафик, который отправляется в виде показателей StatsD (на порт 8125).

Самый простой подход, который я пробовал, - запустить nc -ul 8125 который выводит метрики на терминал ... но они не разделяются новой строкой. Кроме того, передача вывода в grep ничего не отображает.

Следующий подход, который я попробовал, был socat - udp-listen:8125 что дает аналогичные результаты для netcat.

Однако, когда я прохожу в квартире -v и труба из stderr в стандартный вывод, (socat -v - udp-listen:8125 2> &1 | grep ...), то я получаю довольно неплохие результаты, но есть много дополнительных нежелательных результатов.

Еще пробовал tshark, tshark -l -f "port 8125" -i ln0 -E separator=, -Tfields -e data но это выводит результат как шестнадцатеричный ... не ascii. Я могу передать флаг -x, который печатает как шестнадцатеричный, так и ascii рядом. Не совсем то, что я хочу, и не очень дружелюбный к grep. Я также пробовал кучу других вариантов tshark, но ничто не могло просто распечатать метрики UDP.

Я видел несколько примеров, когда кто-то, делающий что-то подобное, выводил по конвейеру, например | while read output; do echo $output; done; Однако у меня не было никакого успеха с этим подходом, и я не совсем юникс, поэтому я изо всех сил пытаюсь найти решение.

В конце концов, это не такая уж необычная задача, и nc -ul 8125 является почти там....

Чтобы дать больше контекста ... код, выполняющий отправку, выглядит так:

var udpClient = new UdpClient();
udpClient.Connect("127.1", 9999);
while (true)
{
    var bytes = Encoding.UTF8.GetBytes("hi");
    udpClient.Send(bytes, bytes.Length);
    Thread.Sleep(1000);
}

желаемый результат будет выглядеть как

hi
hi
hi
...

в то время как nc -ul 9999 выходы hihihihihi....

socat -u UDP-RECVFROM:8125,fork SYSTEM:"sed G"

Кажется, это работает, хотя добавлено немного больше, чем просто новая строка. Также, возможно, эта ветка может помочь: https://unix.stackexchange.com/questions/458951/how-can-i-add-message-delimiters-to-a-udp-stream-socat-is-piping

Чтобы расширить почему sed G работает... sed имеет два "пробела", шаблонное пространство и место для хранения. sed G в основном берет то, что в шаблон пробел и добавляет к нему новую строку. В этом случае шаблон пробел пуст, поэтому он просто добавляет новую строку.