Udp

如何擷取 UDP 流量,以便將其通過管道傳輸到 grep

  • April 11, 2020

我正在嘗試擷取作為 StatsD 指標發送的 UDP 流量(在埠 8125 上)。

我嘗試過的最簡單的方法是執行nc -ul 8125將指標列印到終端……但它們不是換行符分隔的。此外,將輸出傳送到 grep 不會顯示任何內容。

我嘗試的下一個方法是socat - udp-listen:8125與 netcat 給出類似的結果。

但是,當我將 -v flat管道 stderr 傳遞給 stdout, ( socat -v - udp-listen:8125 2> &1 | grep ...) 時,我會得到模糊的不錯的結果,但還有很多額外的不需要的輸出。

我也嘗試過 tshark,tshark -l -f "port 8125" -i ln0 -E separator=, -Tfields -e data但這會將輸出列印為十六進制……而不是 ascii。我可以傳入 -x 標誌,它並排列印十六進制和 ascii。不是我想要的,也不是很友好。我還嘗試了許多其他 tshark 選項,但沒有任何東西能夠簡單地列印 UDP 指標。

我已經看到一些例子,其中有人做類似的事情是 pipling output like| while read output; do echo $output; done;但是,我沒有用這種方法取得任何成功,而且我不是一個真正的 unix 人,所以我正在努力想出一個解決方案。

畢竟,這似乎並沒有什麼不尋常的任務,而且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基本上採用模式空間中的內容並為其添加換行符。在這種情況下,模式空間是空的,因此它實際上只是添加了一個新行。

引用自:https://serverfault.com/questions/1011674