2016-11-11 2 views
5

계속해서 pcap 파일을 생성했습니다. 지속적으로 tshark/wireshark에 피드를 계속 제공하려고합니다. 여기에, 나는 (OSX)지속적으로 pcap 파일을 tshark/wireshark에 넘겨주기

mkfifo tsharkin 
tail -f -c +0 tsharkin | tshark -l -i - > tsharkout 2>stderr & 
cat file1.pcap > tsharkin 
위 tsharkout

cat file2.pcap > tsharkin 

에서 file1.pcap에서 위의 잘 작동, 내가 기대 얻을 출력이 작동하지 않습니다

, 나는 tsharkout에서 아무것도 얻을 시도 것입니다 하지만 난 다시 시도

cat file2.pcap > tsharkin 

꼬리/tshark를 프로세스가/충돌

을 중지하게 표준 에러에 + "캡처 3 개 패킷을" "1 개 패킷이 떨어졌다"GET

다시 시도했지만, 이번에는 file2.pcap을 먼저 수행 한 다음 file1.pcap을 사용했습니다. 이번에는 file2.pcap이 잘 처리되고 file1.pcap은 tail/tshark 프로세스를 중지/중단시킵니다. 그래서 나는 두 pcap-file에 아무런 문제가 없다고 결론을 내릴 것입니다. 그러나 tshark는 두 개 이상의 pcap-file이있는 것을 좋아하지 않습니다.

그냥 내가 먼저 mergecap를 사용 file1.pcap 및 file2.pcap을 병합 시도를 테스트하고 file1.pcap 및 파일 2에서 모두

mergecap -F pcap -w file1_2.pcap file1.pcap file2.pcap 
cat file1_2.pcap > tsharkin 

이 잘 작동, 내가 기대 얻을 tshark를에 출력을 그 먹이를 .pcap in tsharkout

문제는 내 pcap 파일이 길을 따라 도착하는 것이므로 tshark에 먹이기 전에 모두 병합 할 수 없다는 것입니다. pcap-files가 도착할 때, "끊임없이 돌아가는"tshark에게 먹일 수 있어야합니다. 어떻게해야합니까?

+0

노드 서버에서이 코드를 랩핑하고 파일을 수신 할 때마다 새 tshark을 생성하지 않는 이유는 무엇입니까? -상위 수준 알고리즘 - 새로 생성 된 파이프에서 pcap을 수신합니다. (가능하면 타임 스탬프에 이름을 지정하십시오) - 노드 애플리케이션이 새로 생성 된 명명 된 파이프를 검사 할 디렉토리를 폴링하도록 만듭니다. - 명명 된 파이프에서 pcap을 받으면 tshark를 실행하는 자식 프로세스를 생성합니다. - 결과를 공통 디렉토리에 씁니다. – Himanshu97

+0

@ Himanshu97 그렇게하지 않겠습니다. 두 개의 연속 pcap-file은 동일한 세션에 속한 데이터를 포함 할 수 있습니다. 예 : html 문서가 여러 ip 패킷을 통해 유선을 통해 전송되었습니다. 이러한 IP 패킷의 첫 번째 절반은 file1.pcap에있을 수 있으며 나머지 절반은 file2.pcap에있을 수 있습니다. 그 html 문서를 재구성하고 싶습니다. 그리고 그것은 동일한 tshark 인스턴스로 피드하는 경우 file1.pcap 및 file2.pcap 만 발생합니다. –

+0

그럴 경우이 파일을 유닉스 파이프에 간단히 파이프 할 수 있습니다 ( "cat '| tsharkin" ). tshark은 항상 파이프에서 읽습니다. 그러면 파일 내용을 파이프에 추가합니다. 및 명명 된 파이프가 FIFO로 작동하므로 제대로 작동합니다. – Himanshu97

답변

1

TL; libpcap 파일의 파일 크기는 a header입니다. 당신은 두 번째 이후 캡처 파일을 제거해야합니다

cat file2.pcap | tail -c +25 > tsharkin 

내 출력, 두 번 같은 파일 tshark를 공급하는 경우 :

1 0.000000 10.0.0.1 → 10.0.0.2 TLSv1.2 246 Application Data 
2 0.058816 10.0.0.2 → 10.0.0.1 TCP 66 443 → 58616 [ACK] Seq=1 Ack=181 Win=1701 Len=0 TSval=3578216450 TSecr=5878499 

3 0.000000 10.0.0.1 → 10.0.0.2 TLSv1.2 246 [TCP Spurious Retransmission] , Application Data 
4 0.058816 10.0.0.2 → 10.0.0.1 TCP 66 443 → 58616 [ACK] Seq=1 Ack=181 Win=1701 Len=0 TSval=3578216450 TSecr=5878499 

세부

으로 설명을 the documentation for the libpcap format에서 libpcap 파일은 24 바이트 글로벌 헤더. 이 전역 헤더 바로 뒤에 패딩없이 패킷 (their own libpcap header)이옵니다.

따라서 libpcap 파일을 tshark에 공급할 때 tshark가 전역 헤더를 요구하기 때문에 첫 번째 파일은 정상적으로 작동합니다. 그러나 후속 파일에 대한 피드를 기대하지는 않습니다. 이로 인해 tshark는 두 번째 파일 (실제로는 글로벌 헤더)을 잘못된 형식의 패킷으로 간주하고 삭제합니다 ("1 패킷 삭제됨"). 나는 왜 tshark가 세 번째 파일로 멈추는 지 모르겠다.

모든 캡처 파일이 같은 형식 (파일 pcapng 조심)와 같은 헤더있을 것이라는 점을 확신하는 경우, 당신은 안전하게 두 번째 파일의 글로벌 헤더 (이후 파일을 제거 할 수 있습니다)를 보내고 이름있는 파이프로 보냅니다.

tail -c +startoffset file 

가 24 바이트 인 글로벌 헤더, 우리는 25 바이트에서 캡처 파일을 읽기 시작하려면 이렇게하는 한 가지 방법은 이미 귀하의 질문에 사용 된 꼬리 구문을 사용하는 것입니다.

동일한 헤더에 대한 참고 사항. 모든 캡처 파일이 같은 방법으로 검색되면 동일한 글로벌 헤더가있는 것일 수 있습니다. 특히, 물리 계층 프로토콜 (예를 들어, 이더넷)은 동일 할 필요가있다. 해당 전체 헤더에는 형식의 버전 (예 : 2.4), 시간대 및 패킷의 최대 캡처 길이도 포함됩니다.

+0

내가 왜 이런 생각을하지 않았는지 이해하지 못한다. 나는 그것을 테스트하지 않았지만 그것이 효과가있을 것이라고 확신한다. 감사! –

관련 문제