tcpdump
의 출력 형식에 의존하여 grep -Po '(?<=length)\d+(?=\))'
과 같은 패킷 길이를 추출 할 수 있습니다.
여기 grep
의 -P
스위치는 Perl 정규 표현식을 켭니다. -o
은 grep이 일치하는 부분 만 출력하도록합니다. 그런 다음 (?<=length)
정규 표현식의 일부가 lookbehind를 수행하므로 일치하기 전에 length[space]
이어야합니다. \d+
은 하나 이상의 숫자를 탐욕스럽게 여기고 (?=\))
부분은 미리보기를 수행하므로 닫는 중괄호는 일치해야합니다. Lookaheads와 Lookbehinds는 서로 일치하지 않습니다. 그들을 앵커로 생각하십시오. 당신이 endline 앵커를 추가하여 정규식 더 엄격 할 수
주, $
: 당신이 당신의 접근 방식은 휴대용 및 보편적하려면 (?<=length)\d+(?=\)$)
은 정말이 일을 권하고 싶지 않다.
while read lngth ; do sh cap.sh "$lngth" ; done< <(unbuffer tcpdump -i eth1 -nttv 2>/dev/null | unbuffer -p grep -Po '(?<=length)\d+(?=\))')
이 그렇게 당신이 파이프 버퍼를 플러시 가득 찰 때까지 기다릴 필요가 없습니다 expect에서 unbuffer
를 사용 유의하시기 바랍니다처럼
그래서 모든 게 보일 것이다.
길이를 추출하는 또 다른 방법은 파이썬 (https://github.com/secdev/scapy, https://github.com/phaethon/scapy)에 대한 패킷 검사/조작 모듈 인 scapy
과 같은 것을 사용하는 것입니다. scapy
를 사용하여 무한 루프에서 IP 패킷의 길이를 인쇄 파이썬 스크립트는 다음과 같이 표시됩니다
from scapy.all import *
sniff(filter='ip', prn=lambda x: x.sprintf("%IP.len%"))
그래서이 스크립트로 tcpdump | grep
부품을 교체하거나 어쩌면 파이썬에서 cap.sh
를 다시 작성하고 작업을 수행 파이썬에서 모든 것.
고마워, 당신은 정규식 무슨 짓을 설명 할 수있는, 나는 tcpdump와 그렙을 시도했지만 패킷 길이를 추출하지 않았다. – user2532296
예. 답변을 수정했습니다. regexes에 대한 훌륭한 참고 자료로 [this] (http://www.regular-expressions.info) 리소스를 확인하는 것도 좋습니다. –
정보를 제공해 주셔서 감사합니다. 여기 (https://regex101.com/) 시도했지만 여전히 작동하지 않습니다. – user2532296