Linux中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);
}

上邊的demo為抓取跟ip地址為172.17.195.56,端口為80(http默認端口)的機器的通信,tshark會提供包解析之后的xml數據,程序將其存儲到文件。注意部分數據是需要由hex字符串轉換為真實字符串的,另外還可能會有需要gzip解壓。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM