即時找到字串時過濾 tcpdump 的輸出並執行腳本

即時找到字串時過濾 tcpdump 的輸出並執行腳本

我有這個命令顯示在連接埠 1700 上接收和發送的資料包。

tcpdump -AUq 連接埠 1700

資料包中有字串rxpk,但大多數資料包沒有它。當輸出包含此字串時,我希望運行一些腳本(閃爍 LED)。

tcpdump -AUq port 1700 | awk '/rxpk/ { print | "/path/to/blink_led 18" }'

但似乎它只在第一次rxpk找到時匹配,後續發生的情況不會觸發{ ... }- 部分

有人知道為什麼嗎?或甚至是在rxpk收到腳本時運行腳本的其他方法?

答案1

LED 僅閃爍一次的原因是,當您列印到管道時,管道保持開啟狀態,因此只有一次 的呼叫blink_led。如果blink_led要讀取其標準輸入以獲取說明,那麼這不會是問題。如果它無法讀取 stdin 並退出,那麼awk也會退出。

解決這個問題的傳統方法是使用close()管道,以便下一次呼叫啟動一個新的:

tcpdump -Alq port 1700 | awk '
  BEGIN { mypipe="/path/to/blink_led 18"; }
  /rxpk/ { print | mypipe; close(mypipe); }'

system()也很好,正如 @heemayl 所建議的(如果blink_led根本沒有興趣閱讀 stdin,可能會更好)。

您會注意到我使用-l而不是-U,-l刷新標準輸出,以避免在您想要的輸出在 stdio 緩衝區中等待時暫停(當您用於寫入檔案-U時啟用整個資料包刷新)。-w

相關內容