목표는 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();
}
}
도움을 주셔서 감사합니다.
프로그램에 직접 tcpdump와의 출력을 배관 할 때 문제의 어떤 종류가 있습니까? –
libpcap을 사용 해본 적이 있습니까? pthreads와 함께 사용하면 캡처하는 것을 더 잘 제어 할 수 있습니다 (pthread를 사용하여 스레드를 포크로 만들어 pcap_loop로 희생 시키십시오). –
Ninefinger는 libpcap과 pthreads를 사용하는 것이 좋습니다. dave 덕택에 스크립트가 작동하지만 크게 개선하는 데 관심이 있습니다. 먼저 pthread와 libpcap ++에 대해 많은 책을 읽어야 할 것입니다. 감사! – GreeenGuru