命令行工具tshark使用小記

1、目的

  寫這篇博客的目的主要是為了方便查閱,使用wireshark可以分析數據包,可以通過編輯過濾表達式來達到對數據的分析;但我的需求是,怎么樣把Data部分導出來,因為后續的工作主要針對數據包的Data部分,主要是對本地存儲的.pcap文件進行解析。這時候就會使用到tshark命令行工具,可以通過命令提取自己想要的數據,可以重定向到文件,也可以結合上層語言比如Java,來調用命令行,實現對數據的處理!

  下面我會從?相關實例、選項介紹、部分實例運行結果?進行概括!

2、首先我們先來看一下網上的一些例子,我對這些例子進行了整理,并給出了說明。

復制代碼
//打印http協議流相關信息
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字節;     -i: 捕獲eth0網卡;     -n: 禁止網絡對象名稱解析;     -f: 只捕獲協議為tcp,目的端口為80;     -R: 過濾出http.host和http.request.uri;     -T,-e: 指的是打印這兩個字段;     -I: 輸出到命令行界面; //實時打印當前mysql查詢語句 tshark -s 512 -i eth0 -n -f 'tcp dst port 3306' -R 'mysql.query' -T fields -e mysql.query    注釋:     -R: 過濾出mysql的查詢語句; //導出smpp協議header和value的例子 tshark -r test.cap -R '(smpp.command_id==0x80000004) and (smpp.command_status==0x0)' -e smpp.message_id -e frame.time -T fields -E header=y >test.txt    注釋:
    -r: 讀取本地文件,可以先抓包存下來之后再進行分析;
    -R: smpp...可以在wireshark的過濾表達式里面找到,后面會詳細介紹;
    -E: 當-T字段指定時,設置輸出選項,header=y意思是頭部要打印;
    -e: 當-T字段指定時,設置輸出哪些字段;
     >: 重定向; //統計http狀態 tshark -n -q -z http,stat, -z http,tree
   注釋:
    -q: 只在結束捕獲時輸出數據,針對于統計類的命令非常有用;
    -z: 各類統計選項,具體的參考文檔,后面會介紹,可以使用tshark -z help命令來查看所有支持的字段;        http,stat: 計算HTTP統計信息,顯示的值是HTTP狀態代碼和HTTP請求方法。
       http,tree: 計算HTTP包分布。 顯示的值是HTTP請求模式和HTTP狀態代碼。 //抓取500個包提取訪問的網址打印出來 tshark -s 0 -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 -c 500    注釋:
    -f: 抓包前過濾;
    -R: 抓包后過濾;
    -l: 在打印結果之前清空緩存;
    -c: 在抓500個包之后結束; //顯示ssl data數據 tshark -n -t a -R ssl -T fields -e "ip.src" -e "ssl.app_data"
//讀取指定報文,按照ssl過濾顯示內容 tshark -r temp.cap -R "ssl" -V -T text
  注釋:
    -T text: 格式化輸出,默認就是text;
    -V: 增加包的輸出;//-q 過濾tcp流13,獲取data內容 tshark -r temp.cap -z "follow,tcp,ascii,13" //按照指定格式顯示-e tshark -r temp.cap -R ssl -Tfields -e "ip.src" -e tcp.srcport -e ip.dst -e tcp.dstport //輸出數據 tshark -r vmx.cap -q -n -t ad -z follow,tcp,ascii,10.1.8.130:56087,10.195.4.41:446 | more   注釋:
    -t ad: 輸出格式化時間戳; //過濾包的時間和rtp.seq tshark -i eth0 -f "udp port 5004" -T fields -e frame.time_epoch -e rtp.seq -o rtp.heuristic_rtp:true 1>test.txt
  注釋:
    -o: 覆蓋屬性文件設置的一些值;
//提取各協議數據部分 tshark -r H:/httpsession.pcap -q -n -t ad -z follow,tcp,ascii,71.6.167.142:27017,101.201.42.120:59381 | more
復制代碼

上面的例子已經涵蓋了大部分的選項,下面我針對每一個選項進行簡要解釋,并給出這個選項常用的值;

3、選項介紹

  在命令行下可以使用tshark -help得到選項的簡單介紹,具體的需要查閱官方文檔https://www.wireshark.org/docs/man-pages/tshark.html

復制代碼
捕獲接口:-i: -i <interface> 指定捕獲接口,默認是第一個非本地循環接口;-f: -f <capture filter> 設置抓包過濾表達式,遵循libpcap過濾語法,這個實在抓包的過程中過濾,如果是分析本地文件則用不到。-s: -s <snaplen> 設置快照長度,用來讀取完整的數據包,因為網絡中傳輸有65535的限制,值0代表快照長度65535,默認也是這個值;-p: 混合模式工作,即只關心和本機有關的流量。-B: -B <buffer size> 設置緩沖區的大小,只對windows生效,默認是2M;-y: -y<link type> 設置抓包的數據鏈路層協議,不設置則默認為-L找到的第一個協議,局域網一般是EN10MB等;   -D: 打印接口的列表并退出;   -L?列出本機支持的數據鏈路層協議,供-y參數使用。 捕獲停止選項:   -c: -c <packet count> 捕獲n個包之后結束,默認捕獲無限個;   -a: -a <autostop cond.> ... duration:NUM,在num秒之后停止捕獲;                    filesize:NUM,在numKB之后停止捕獲;                   files:NUM,在捕獲num個文件之后停止捕獲; 捕獲輸出選項:   -b <ringbuffer opt.> ... ring buffer的文件名由-w參數決定,-b參數采用test:value的形式書寫;                  duration:NUM - 在NUM秒之后切換到下一個文件;                  filesize:NUM - 在NUM KB之后切換到下一個文件;                  files:NUM - 形成環形緩沖,在NUM文件達到之后; RPCAP選項:   remote packet capture protocol,遠程抓包協議進行抓包;   -A: -A <user>:<password>,使用RPCAP密碼進行認證; 輸入文件:   -r: -r <infile> 設置讀取本地文件 處理選項:   -2: 執行兩次分析   -R: -R <read filter>,包的讀取過濾器,可以在wireshark的filter語法上查看;在wireshark的視圖->過濾器視圖,在這一欄點擊表達式,就會列出來對所有協議的支持。   -Y: -Y <display filter>,使用讀取過濾器的語法,在單次分析中可以代替-R選項;   -n: 禁止所有地址名字解析(默認為允許所有)   -N: 啟用某一層的地址名字解析。“m”代表MAC層,“n”代表網絡層,“t”代表傳輸層,“C”代表當前異步DNS查找。如果-n-N參數同時存在,-n將被忽略。如果-n-N參數都不寫,則默認打開所有地址名字解析。   -d: 將指定的數據按有關協議解包輸出,如要將tcp 8888端口的流量按http解包,應該寫為“-d tcp.port==8888,http”;tshark -d. 可以列出所有支持的有效選擇器。    輸出選項:   -w: -w <outfile|-> 設置raw數據的輸出文件。這個參數不設置,tshark將會把解碼結果輸出到stdout,“-w -”表示把raw輸出到stdout。如果要把解碼結果輸出到文件,使用重定向“>”而不要-w參數  -F: -F <output file type>,設置輸出的文件格式,默認是.pcapng,使用tshark -F可列出所有支持的輸出文件類型。   -V: 增加細節輸出;   -O: -O <protocols>,只顯示此選項指定的協議的詳細信息。   -P: 即使將解碼結果寫入文件中,也打印包的概要信息;   -S: -S <separator> 行分割符   -x: 設置在解碼輸出結果中,每個packet后面以HEX dump的方式顯示具體數據。   -T: -T pdml|ps|text|fields|psml,設置解碼結果輸出的格式,包括text,ps,psmlpdml,默認為text   -e: 如果-T fields選項指定,-e用來指定輸出哪些字段;   -E: -E <fieldsoption>=<value>如果-T fields選項指定,使用-E來設置一些屬性,比如     header=y|n     separator=/t|/s|<char>     occurrence=f|l|a     aggregator=,|/s|<char>   -t: -t a|ad|d|dd|e|r|u|ud 設置解碼結果的時間格式。“ad”表示帶日期的絕對時間,“a”表示不帶日期的絕對時間,“r”表示從第一個包到現在的相對時間,“d”表示兩個相鄰包之間的增量時間(delta。   -u: s|hms 格式化輸出秒;   -l: 在輸出每個包之后flush標準輸出   -q: 結合-z選項進行使用,來進行統計分析;   -X: <key>:<value> 擴展項,lua_script、read_format,具體參見 man pages;   -z:統計選項,具體的參考文檔;tshark -z help,可以列出,-z選項支持的統計方式。    其他選項:   -h: 顯示命令行幫助;   -v: 顯示tshark 的版本信息; 
復制代碼

?4、部分命令測試

  在第三節我簡要介紹了tshark相關的命令,在這一節我們主要測試幾個選項的輸出結果,來對命令加深理解。對于第三節的命令選項,比較重要的已經用藍色標出,方便查閱。

  使用tshark對數據包進行分析,主要是對過濾器的學習,根據自己的需求寫出響應的過濾器,來得到相應的數據。

  針對于我的需求,先抓包在分析,還想將命令行整合進java語言中,然后進行面向對象的分析,那么就需要一些特別的命令來獲取一些數據:

復制代碼
//1. 示例1,分析報文封裝的協議C:\Users\sdut>tshark -r H:\httpsession.pcap -T fields -e frame.number -e frame.protocols -E header=y--輸出  frame.number??? frame.protocols1?????? eth:ethertype:ip:tcp2?????? eth:ethertype:ip:tcp3?????? eth:ethertype:ip:tcp4?????? eth:ethertype:ip:tcp:http5?????? eth:ethertype:ip:tcp6?????? eth:ethertype:ip:tcp:http:data-text-lines7?????? eth:ethertype:ip:tcp8?????? eth:ethertype:ip:tcp9?????? eth:ethertype:ip:tcp-e frame.number:顯示幀序號-e frame.time: 顯示時間,時間格式為 Sep 21, 2016 17:20:02.233249000 中國標準時間 -e frame.protocols: 顯示此數據包使用的協議-e ip.src: 顯示源ip,但是不能跟frame一起用-e ip.dst: 顯示目的ip地址;-e tcp.port: 顯示端口號。......還有很多,針對需求,一方面可以自己通過wireshark軟件顯示的頭部字段來猜測,另一方面可以查閱文檔,https://www.wireshark.org/docs/dfref/,這里面列出了所有支持的-e字段寫法,可以在里面搜索ip、frame上面我們使用的這幾個就會搜到。

//2.示例2C:\Users\sdut>tshark -2 -r H:\httpsession.pcap -R "http.request.line || http.file_data || http.response.line" -T fields -e http.request.line -e http.file_data -e http.response.line -E header=y輸出:該例子輸出http協議的請求頭,響應頭,和響應數據;http.request.line  http.file_data  http.response.line   ......          ......      ......   具體的這個-R過濾寫法,可以查看文檔,根據自己的需求來。https://wiki.wireshark.org/DisplayFilters //3.示例3   使用windows版本的tshark,抓包存儲到本地。每個包只讀取1024字節。   tshark -w E:/1015.pcap -s 1024 -i 本地連接 -q -F pcap ......
復制代碼

5、參考文獻

  tshark官方文檔:https://www.wireshark.org/docs/man-pages/tshark.html

  wireshark wiki:https://wiki.wireshark.org/

  捕獲過濾器?https://wiki.wireshark.org/CaptureFilters

  顯示過濾器,用于display過濾的字段可以通過https://wiki.wireshark.org/DisplayFilters?查詢。如果不過濾-e指定的字段數據都會輸出,通過-R過濾之后,只有滿足規則的才會輸出,會因此-R和-T、-e通常會一起使用。

  統計:https://wiki.wireshark.org/Statistics

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/385056.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/385056.shtml
英文地址,請注明出處:http://en.pswp.cn/news/385056.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

winshark重要數據結構

說起來有一些慚愧&#xff0c;研究wireshark有一段時間了&#xff0c;但是對源代碼的分析卻至今沒有什么進展。。。 最初想要研究wireshark是因為我的開題是基于wireshark來做的。 現在有很多抓包工具&#xff0c;wireshark的優勢在于完全開源&#xff0c;分析功能強大&#xf…

C語言寫數據庫(二)

簡單的實現增刪查改的操作后&#xff0c;實現了一個先讀寫其中一個表的某兩項內容&#xff0c;再把相關字符段寫入到另外一張表中去。涉及到查詢和插入兩個步驟。 其中還涉及到漢字的讀寫和插入&#xff0c;會有字符的操作產生亂碼。所以要先保證mysql的漢字字符編碼&#xff0…

wireshark源代碼分析

各位親&#xff0c;不是我不想回復你們的問題。是我也不了解。不能誤導。希望大家相互幫助。看看能否幫那些提問的小盆友們回復一下呢&#xff1f; 這些都是轉載的&#xff0c;如果實在沒有辦法&#xff0c;可以打開鏈接到原作者哪里去提問試試看。。。 經過多次嘗試&#xf…

C語言寫數據庫(三)

遇到的問題以及解決思路方法 1.外部導入數據庫文件 進入mysql&#xff0c;創建數據庫sh_robot source /home/exbot/sh_robot.sql 查看數據庫編碼格式 show variables like “%char%”; 2.數據庫插入操作 進入相關數據庫&#xff1a;use 數據庫名&#xff1b; 查詢存在該表是否存…

Makefile(一)

在一個文件夾中建一個c文件 //main.c #include<stdio.h> int main() {printf("version 1.0");return 0; } 在當前目錄下編寫makefile文件 //makefile: test : main.o //一種依賴關系聲明&#xff0c;生成test可執行程序需要以來main.o文件gcc -o test main.…

Defunct進程 僵尸進程

在測試基于 DirectFBGstreamer 的視頻聯播系統的一個 Demo 的時候&#xff0c;其中大量使用 system 調用的語句&#xff0c;例如在 menu 代碼中的 system("./play") &#xff0c;而且多次執行&#xff0c;這種情況下&#xff0c;在 ps -ef 列表中出現了大量的 defunc…

make文件基礎用法

參照&#xff1a;https://www.jianshu.com/p/0b2a7cb9a469 創建工作目錄&#xff0c;包含一下文件 main.cperson.cb.hc.h/*** c.h ***/ //this is c.h /*** b.h ***/ //this is b.h /*** main.c ***/ #include<stdio.h> //#include"a1.h" //#include"b.h&…

一個Linux下C線程池的實現(轉)

1.線程池基本原理 在傳統服務器結構中, 常是 有一個總的 監聽線程監聽有沒有新的用戶連接服務器, 每當有一個新的 用戶進入, 服務器就開啟一個新的線程用戶處理這 個用戶的數據包。這個線程只服務于這個用戶 , 當 用戶與服務器端關閉連接以后, 服務器端銷毀這個線程。然而頻繁地…

二維數組作為函數參數

#include<stdio.h> //#include<> //二位數組作為函數參數時&#xff0c;可以不指定第一個下標 void print_buf(int (*p)[3],int a,int b) //void print_buf(int p[][3],int a,int b) {int i,j;for(i 0 ; i < a; i){for(j 0; j < b; j){printf("p[%…

mystrcat

#include<stdio.h> //如果一個數組做為函數的形參傳遞&#xff0c;那么數組可以在被調用的函數中修改 //有時候不希望這個事發生&#xff0c;所以對形參采用const參數 //size_t strlen(const char *s); //strcpy(char* s1,const char* s2); void mystrcat(char *s1,cons…

關于非阻塞的recv的時候返回的處理

注意recv&#xff08;&#xff09;如果讀到數據為0&#xff0c;那么就表示文件結束了&#xff0c;如果在讀的過程中遇到了中斷那么會返回-1&#xff0c;同時置errno為EINTR。 因此判斷recv的條件&#xff1a; 如果read返回<0 如果0 表示文件結束&…

帶參程序

windows環境 #include<stdio.h>int main(int argc, char *argv[]) {printf("argc %d\n", argc);for (int i 0; i < argc; i){printf("argv[%d] %s\n",i, argv[i]);}system("pause");return 0; } windows環境下&#xff0c;帶參函數…

Ubuntu安裝mysql步驟

1.打開終端&#xff0c;輸入&#xff1a; sudo apt-get updata 輸入root用戶密碼 2.更新完畢后&#xff0c;輸入 sudo apt-get install mysql-server ubuntu14.04安裝中間會讓你設置密碼&#xff0c;輸入密碼后點擊確認(mysql123) 3.安裝結束后&#xff0c;查看端口號是否開啟 …

Pthread創建線程后必須使用join或detach釋放線程資源

這兩天在看Pthread 資料的時候&#xff0c;無意中看到這樣一句話(man pthread_detach): Either pthread_join(3) or pthread_detach() should be called for each thread that an application creates, so that system resources for the thread can be released. …

二維數組求平均值(指針的使用)

#include<stdio.h>int main() {int buf[3][5] {{1,2,3,4,5},{4,5,6,7,8},{7,8,9,10,11}};int i;int j;//求行平均值 for(i 0; i < 3; i){int sum 0;for(j 0; j < 5; j){sum (*(*(buf i) j));}printf("sum %d\n",sum/5);}//求列平均值for(i 0; i …

linux終端關閉時為什么會導致在其上啟動的進程退出?

現象 經常在linux下開發的人應該都有這樣的經驗&#xff0c;就是在終端上啟動的程序&#xff0c;在關閉終端時&#xff0c;這個程序的進程也被一起關閉了。看下面這個程序&#xff0c;為了使進程永遠運行&#xff0c;在輸出helloworld后&#xff0c;循環調用sleep&#xff1a; …

二維數組做函數參數傳遞

#include<stdio.h> //#include<> //二位數組作為函數參數時&#xff0c;可以不指定第一個下標 void print_buf(int (*p)[3],int a,int b) //void print_buf(int p[][3],int a,int b) {int i,j;for(i 0 ; i < a; i){for(j 0; j < b; j){printf("p[%…

libevent源碼深度剖析

第一章 1&#xff0c;前言 Libevent是一個輕量級的開源高性能網絡庫&#xff0c;使用者眾多&#xff0c;研究者更甚&#xff0c;相關文章也不少。寫這一系列文章的用意在于&#xff0c;一則分享心得&#xff1b;二則對libevent代碼和設計思想做系統的、更深層次的分析&#xff…

函數返回指針類型(strchr函數)

#include<stdio.h> #include<string.h> char *mystrchr(char *s,char c) {while(*s){if(*s c){return s;}s;}return NULL; }int main() {char str[100] "hello world";//char* s strchr(str,a);char *s mystrchr(str,e);//返回ello world字符串 prin…

函數與指針

#include<stdio.h>int add(int a,int b) {return ab; }int main() {void *p(int,char *); //聲明了一個函數 &#xff0c;函數名為p&#xff0c;函數返回值為void*,函數的 void (*p)(int,char *);//定義了一個指向參數為int和char*返回值為void的函數指針//定義一個參數為…