2010-03-15 1 views
2

목표는 tcpdump를 사용하여 방문한 URL의 패킷 헤더를 마이닝하는 것입니다.Linux에서 지속적인 파이프 입력을 허용하도록 C++ 응용 프로그램을 수정하는 데 도움이 필요합니다.

tcpdump "dst port 80 and tcp[13] & 0x08 = 8" -A -s 300 | tee -a ./Desktop/packets.txt 

그리고 헤더를 구문 분석하고 다음 명령 주어 졌을 때 URL을 추출하는 프로그램을 작성했습니다 : 지금까지

, 내가 사용하여 파일에 패킷 헤더를 저장할 수 있습니다

tcpdump "dst port 80 and tcp[13] & 0x08 = 8" -A -s 300 | ./packet-parser.exe 
,536 :
cat ~/Desktop/packets.txt | ./packet-parser.exe 

하지만 내가 할 수 있기를 원하는 것은 다음 데이터를 기록합니다 내 프로그램에 직접 파이프는 tcpdump입니다

다음은 그대로 스크립트입니다. 질문은 tcpdump의 지속적인 입력을 지원하기 위해 어떻게 변경해야합니까?

#include <boost/regex.hpp> 
#include <fstream> 
#include <cstdio> // Needed to define ios::app 
#include <string> 
#include <iostream> 

int main() 
{ 
    // Make sure to open the file in append mode 
    std::ofstream file_out("/var/local/GreeenLogger/url.log", std::ios::app); 
    if (not file_out) 
     std::perror("/var/local/GreeenLogger/url.log"); 
    else 
    { 
     std::string text; 
     // Get multiple lines of input -- raw 
     std::getline(std::cin, text, '\0'); 
     const boost::regex pattern("GET (\\S+) HTTP.*?[\\r\\n]+Host: (\\S+)"); 
     boost::smatch match_object; 
     bool match = boost::regex_search(text, match_object, pattern); 
     if(match) 
     { 
      std::string output; 
      output = match_object[2] + match_object[1]; 
      file_out << output << '\n'; 
      std::cout << output << std::endl; 
     } 
     file_out.close(); 
    } 
} 

도움을 주셔서 감사합니다.

+1

프로그램에 직접 tcpdump와의 출력을 배관 할 때 문제의 어떤 종류가 있습니까? –

+1

libpcap을 사용 해본 적이 있습니까? pthreads와 함께 사용하면 캡처하는 것을 더 잘 제어 할 수 있습니다 (pthread를 사용하여 스레드를 포크로 만들어 pcap_loop로 희생 시키십시오). –

+0

Ninefinger는 libpcap과 pthreads를 사용하는 것이 좋습니다. dave 덕택에 스크립트가 작동하지만 크게 개선하는 데 관심이 있습니다. 먼저 pthread와 libpcap ++에 대해 많은 책을 읽어야 할 것입니다. 감사! – GreeenGuru

답변

1

당신은 그것을 얻이 몇 가지 더 변경해야 할 것입니다. '\ 0'으로 구분 된 getline은 '\ 0'(발생하지 않음) 또는 입력이 EOF에 도달 할 때까지 종료되지 않습니다. 그래서 파일을 사용할 때 (결국 EOF에 도달하지만) tcpdump에서 곧바로 스트리밍하지 않을 때 작동합니다.

부스트로 컴파일하는 데 문제가있어서 아직 제대로 작동하지 않을 것입니다. 그러나 당신은 아이디어를 얻어야합니다. [편집 : 그것은 작동 :-)]

std::string text, line1, line2; 

std::getline(std::cin, line1); 
while(std::getline(std::cin, line2)) { 
    text = line1 + '\n' + line2; 
    // ... 
    line1 = line2; 
} 
file_out.close(); 
+0

dave, 정말 고마워. 이것은 완벽하게 작동했습니다. 나는 또한 추가해야했다 : file_out.flush(); 터미널에서 프로세스를 종료하면 파일이 실제로 닫히지 않기 때문에 출력 파일에 기록한 후 업데이트되지 않습니다. 나는 C++을 처음 사용하고 공식 프로그래밍 교육이 없으므로 그 점을 알아 냈을 것입니다. 고마워요! – GreeenGuru

0

수정 : 죄송합니다. 이것은 완전히 잘못되었습니다. 새로운 대답을보십시오.

나는 그것을 시도하지 않은

, 그러나 이것은 아마도 것입니다 작동 :

while(std::getline(std::cin, text, '\0')) { 
    // ... 
} 
file_out.close(); 
관련 문제