2013-07-26 4 views
0

perl 스크립트 내에서 tcpdump로 캡처를 시도합니다. 아이디어는 10000 패킷 또는 10 초 중 빠른 날짜를 캡처하는 것입니다. 나는 10000 패킷에 대해 작동하는 코드를 가지고 있지만, 만약 내가 그것을 취소하기 위해 tcpdump에 SIGINT 또는 SIGTERM을 보내면 출력은 tcpdump의 원시 출력을 처리하는 스크립트의 나머지 부분에서 문제를 일으키는 손상된 것으로 보인다.캡처를 손상시키지 않고 tcpdump를 종료합니다.

관련 펄 코드 : 나는 사람에서 읽은 바로는

tshark: "TheDumpFileFromAbove" appears to have been cut short in the middle of a packet.

:

defined(my $pid = fork()) or die "Cannot fork: $!"; 
    if($pid){ 
     #parent 
     my ($kid,$wait_time) = (0,0); 
     do{ 
      sleep 1; 
      $wait_time++; 
      $kid = waitpid(-1, WNOHANG); 
     }until ($kid > 0 || $wait_time > $MAX_TIME_SEC); 

     #kill the child 
     if ($kid <= 0){ 
      kill('SIGTERM',$pid); 
     } 
    }else{ 
     #child runs tcpdump to get raw data and write it to a temporary file 
     exec('tcpdump','-ieth1','-s0','-c'.$MAX_PACKETS,'-w'.$dmp_name); 
    } 

다음에 어떻게됩니까은 tcpdump에 의해 생성 된 덤프 파일이 오류가 발생하는 tshark에 공급된다는 점이다 페이지를 tcpdump의 SIGTERM 또는 SIGINT으로 올바르게 보내야합니다. (두 가지 모두 시도해 보았습니다) :

if run with the -c flag, it will capture packets until it is interrupted by a SIGINT or SIGTERM signal or the specified number of packets have been processed.

+1

것은, 내가 생각하지 않는다 : 그래서 해결책은 tcpdump와는 tcpdump와의 출력을 처리하는 다음 명령에 계속하기 전에 완료 될 때까지 기다리는 것입니다 당신이 그것에 대해 할 수있는 일이 있습니다. – Barmar

+0

tshark에서 오류를 무시할 수 없습니까? –

+0

@JimGarrison, tshark가 해당 오류로 인해 파일을 처리하지 못함 – Ryley

답변

0

OK, 문제는 경쟁 조건 밝혀 있도록 : 정상적으로 종료 tcpdump를 알려줍니다

kill('SIGTERM',$pid); 

및 캡처에 대한 통계를 쓰는가에가하는 것 중 하나 (즉, 얼마나 많은 패킷). 그 죽인 직후에 진술서를 쓰면 때로는 통계 전에 나타나기도하고 때로는 나타나기도한다는 것을 알았습니다. tcpdump를이 돌봐 신호 처리기가없는 경우

waitpid($pid,0); 
system('tshark -r dumpcapfile ...') 
관련 문제