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표준 입력을 전혀 읽는 데 관심이 없다면 더 나을 수도 있습니다).

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

관련 정보