실시간으로 문자열이 발견되면 tcpdump 출력 필터링 및 스크립트 실행

실시간으로 문자열이 발견되면 tcpdump 출력 필터링 및 스크립트 실행

포트 1700에서 수신 및 전송된 패킷을 표시하는 이 명령이 있습니다.

tcpdump -AUq 포트 1700

패킷에는 문자열이 있지만 rxpk대부분의 패킷에는 문자열이 없습니다. 출력에 이 문자열이 포함되면 일부 스크립트(LED가 깜박임)를 실행하고 싶습니다.

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

그러나 처음 발견된 경우에만 일치하는 것으로 보이며 rxpk후속 발생에서는 { ... }-part가 트리거되지 않습니다.

왜 그런지 아는 사람 있나요? 아니면 스크립트를 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표준 입력을 전혀 읽는 데 관심이 없다면 더 좋을 것입니다).

원하는 출력이 stdio 버퍼에서 대기 중인 경우 일시 중지를 피하기 위해 stdout을 플러시합니다( -l파일 -U에 쓸 때 전체 패킷 플러시를 활성화합니다 ).-l-U-w

관련 정보