Я пытаюсь перехватить 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
в основном берет то, что в шаблон пробел и добавляет к нему новую строку. В этом случае шаблон пробел пуст, поэтому он просто добавляет новую строку.