2016-06-19 5 views
0

패킷이 eth1 포트에 도착할 때마다 패킷 크기를 추출하여이 매개 변수를 스크립트 cap.sh에 전달하고 싶습니다.패킷 크기를 추출하여 스크립트로 매개 변수로 전달

내 방식 :

나는 그것은

1466352405.455975 IP (tos 0x0, ttl 64, id 0, offset 0, flags [DF], proto UDP (17), length 46) 
192.168.52.53.32769 > 192.168.52.54.9600: UDP, length 18 

나는 길이 (46)를 추출 할를 제공

tcpdump -nttv -i eth1을 시도하고 내 스크립트 cap.sh이 통과

sh cap.sh 46 

이것을 구현하는 방법을 알고 싶습니다.

답변

1

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를 다시 작성하고 작업을 수행 파이썬에서 모든 것.

+0

고마워, 당신은 정규식 무슨 짓을 설명 할 수있는, 나는 tcpdump와 그렙을 시도했지만 패킷 길이를 추출하지 않았다. – user2532296

+0

예. 답변을 수정했습니다. regexes에 대한 훌륭한 참고 자료로 [this] (http://www.regular-expressions.info) 리소스를 확인하는 것도 좋습니다. –

+0

정보를 제공해 주셔서 감사합니다. 여기 (https://regex101.com/) 시도했지만 여전히 작동하지 않습니다. – user2532296