好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

Linux中tshark(wireshark)抓包工具使用方法详解

tshark(wireshark)抓包工具是一个非常不错的linux中常用的工具,相比GUI工具可以实现一些自动化,譬如把某些关注的数据抓起下来存放到文本中,下面我们一起来看看tshark(wireshark)工具使用例子。

在Linux下,当我们需要抓取网络数据包分析时,通常是使用tcpdump抓取网络raw数据包存到一个文件,然后下载到本地使用wireshark界面网络分析工具进行网络包分析。

最近才发现,原来wireshark也提供有Linux命令行工具-tshark。tshark不仅有抓包的功能,还带了解析各种协议的能力。下面我们以两个实例来介绍tshark工具。

1、安装方法,代码如下:

  • CentOS: yum install -y wireshark 
  • Ubuntu: apt-get install -y tshark 

    2、实时打印当前http请求的url(包括域名),代码如下:

  • tshark -s 512 -i eth0 -n -f  'tcp dst port 80'  -R  'http.host and http.request.uri'  -T fields -e http.host -e http.request.uri -l | tr -d  '\t'  

    下面介绍参数含义:

    -s 512 :只抓取前512个字节数据

    -i eth0 :捕获eth0网卡

    -n :禁止网络对象名称解析

    -f 'tcp dst port 80' :只捕捉协议为tcp,目的端口为80的数据包

    -R 'http.host and http.request.uri' :过滤出http.host和http.request.uri

    -T fields -e http.host -e http.request.uri :打印http.host和http.request.uri

    -l :输出到标准输出

    3、实时打印当前mysql查询语句

    tshark -s 512 -i eth0 -n -f 'tcp dst port 3306' -R 'mysql.query' -T fields -e mysql.query

    下面介绍参数含义:

    -s 512 :只抓取前512个字节数据

    -i eth0 :捕获eth0网卡

    -n :禁止网络对象名称解析

    -f 'tcp dst port 3306' :只捕捉协议为tcp,目的端口为3306的数据包

    -R 'mysql.query' :过滤出mysql.query

    -T fields -e mysql.query :打印mysql查询语句

    tshark使用-f来指定捕捉包过滤规则,规则与tcpdump一样,可以通过命令man pcap-filter来查得。

    tshark使用-R来过滤已捕捉到的包,与界面板wireshark的左上角Filter一致。

    例子代码如下:

  • std::string decodeHex(const std::string& strHex) 
  •     int  nLen = strHex.length() / 2; 
  •     std::string strRet(nLen, 0); 
  •     for  ( int  i = 0; i != nLen; ++i) 
  •     { 
  •         strRet[i] = ((strHex[2*i]>='a' ) ? (strHex[2*i]- 'a' +10) : (strHex[2*i]- '0' )) * 16; 
  •         strRet[i] += (strHex[2*i+1]>='a' ) ? (strHex[2*i+1]- 'a' +10) : (strHex[2*i+1]- '0' ); 
  •     } 
  •     return  strRet; 
  •  
  • void cswuyg_test_tshark() 
  •     std::wstring strParam =  L"\" C:\\Program Files\\Wireshark\\tshark.exe\ " -i 1 -p -l -T pdml -f \" dst port 80\ " -R \" ip.addr==172.17.195.56\ ""
  •     FILE* stream = NULL
  •     errno_t err = _wfreopen_s(&stream, L"c:\\temp\\cswuyt_test.xml" , L "w" , stdout); 
  •     if (err != 0) 
  •     { 
  •         std::cout << "error"  << std::endl; 
  •     } 
  •  
  •     HANDLE hStd = ::GetStdHandle(STD_OUTPUT_HANDLE); 
  •     //BOOL bSet = ::SetHandleInformation(hStd, HANDLE_FLAG_INHERIT, HANDLE_FLAG_INHERIT); 
  •     STARTUPINFO stStartInfo; 
  •     ZeroMemory(&stStartInfo, sizeof(STARTUPINFO)); 
  •     stStartInfo.cb = sizeof(STARTUPINFO);  
  •     stStartInfo.hStdError = hStd; 
  •     stStartInfo.hStdOutput = hStd; 
  •     PROCESS_INFORMATION stProcInfo;  
  •     ZeroMemory(&stProcInfo, sizeof(PROCESS_INFORMATION)); 
  •     BOOL bSuccess = ::CreateProcess(NULL , const_cast<wchar_t*>(strParam.c_str()),  NULL NULL TRUE , 0,  NULL NULL , &stStartInfo, &stProcInfo);  
  •     ::CloseHandle(stProcInfo.hProcess); 
  •     ::CloseHandle(stProcInfo.hThread); 
  •     ::fclose(stream);  --phpfensi.com  
  • 上边的demo为抓取跟ip地址为172.17.195.56,端口为80(http默认端口)的机器的通信,tshark会提供包解析之后的xml数据,程序将其存储到文件。注意部分数据是需要由hex字符串转换为真实字符串的,另外还可能会有需要gzip解压。

    查看更多关于Linux中tshark(wireshark)抓包工具使用方法详解的详细内容...

  •   阅读:99次