tcpdump统计http请求并导出URL文本
tcpdump统计http请求并导出URL文本
tcpdump
tcpdump是一个用于截取网络分组,并输出分组内容的工具。凭借强大的功能和灵活的截取策略,使其成为类UNIX系统下用于网络分析和问题排查的首选工具
tcpdump 支持针对网络层、协议、主机、网络或端口的过滤,并提供and、or、not等逻辑语句来帮助你去掉无用的信息
语法
tcpdump [ -DenNqvX ] [ -c count ] [ -F file ] [ -i interface ] [ -r file ]
[ -s snaplen ] [ -w file ] [ expression ]
strings
strings命令 在对象文件或二进制文件中查找可打印的字符串。字符串是4个或更多可打印字符的任意序列,以换行符或空字符结束。 strings命令对识别随机对象文件很有用。
语法
strings [ -a ] [ - ] [ -o ] [ -t Format ] [ -n Number ] [ -Number ] [file ... ]
选项
-a --all:扫描整个文件而不是只扫描目标文件初始化和装载段
-f –print-file-name:在显示字符串前先显示文件名
-n –bytes=[number]:找到并且输出所有NUL终止符序列
- :设置显示的最少的字符数,默认是4个字符
-t --radix={o,d,x} :输出字符的位置,基于八进制,十进制或者十六进制
-o :类似--radix=o
-T --target= :指定二进制文件格式
-e --encoding={s,S,b,l,B,L} :选择字符大小和排列顺序:s = 7-bit, S = 8-bit, {b,l} = 16-bit, {B,L} = 32-bit
@ :读取中选项
awk
awk是linux中处理文本的强大工具,或者说是一种专门处理字符串的语言,它有自己的编码格式。awk的强大之处还在于能生成强大的格式化报告。
语法
常用命令
-F
参数:指定分隔符,可指定一个或多个print;
: 打印命令, 后面可字符串的拼接数据字段变量
$0
表示整行文本$1
表示文本行中第一个数据字段$2
表示文本行中第二个数据字段$n
表示文本行中第n个数据字段
getline;
: 常用方法是读取下一行数据 , 也有其他用法
导出方法
tcpdump抓取数据包
tcpdump -i eth0 tcp[20:2]=0x4745 or tcp[20:2]=0x504f -w /tmp/tcp.cap -s 512 2>&1
按Ctrl+C即可结束抓取 , 也可直接设置定时结束 , 如下定时30s后结束抓取:
tcpdump -i eth0 tcp[20:2]=0x4745 or tcp[20:2]=0x504f -w /tmp/tcp.cap -s 512 2>&1 &sleep 30
命令解释
-i
即interface:指定tcpdump需要监听的网卡。默认会抓取第一个网卡 .eth0
即指定的网卡名称 , 可通过ifconfig
命令获取网卡信息tcp[20:2]=0x4745 or tcp[20:2]=0x504f
: 过滤表达式 , 意思是过滤数据包中tcp数据段的21-22字节字符为GET或者POST的数据包 , 即过滤HTTP GET/POST请求的数据包- 该表达式与wireshark表达式一致 , 可用https://www.wireshark.org/tools/string-cf.html生成
-w /tmp/tcp.cap
: 指定tcpdump将抓包数据输出到文件 /tmp/tcp.cap 中而不是标准输出-s 512
即-s len:设置tcpdump的数据包抓取长度为512,如果不设置默认将会是65535字节。对于要抓取的数据包较大时,长度设置不够可能会产生包截断2>&1
: 将标准错误输出重定向到标准输出 , Linux中1
为标准输出(stdout) ,2
为标准错误输出(stderr)&sleep 30
: 命令保持30s
通过strings命令来找出GET/POST的url以及Host
strings /tmp/tcp.cap | grep -E "GET /|POST /|Host:" | grep --no-group-separator -B 1 -E "Host:" | grep --no-group-separator -A 1 -E "GET /|POST /" | awk '{url=$2;getline;host=$2;printf ("%s\n",host""url)}' > /tmp/url.txt
命令解释
strings /tmp/tcp.cap
: 将tcpdump
生成的文件指定为查询字符串的源文件grep -E "GET /|POST /|Host:" | grep --no-group-separator -B 1 -E "Host:" | grep --no-group-separator -A 1 -E "GET /|POST /"
:grep -E "GET /|POST /|Host:"
: 查找以"GET /
、POST /
和Host:
开头的字符串grep --no-group-separator -B 1 -E "Host:" | grep --no-group-separator -A 1 -E "GET /|POST /"
: 保证查询的字符串标准输出均为一行Host:
紧接着一行GET /
或POST /
- 此处将多出的几行
/biling
登录的url都给去除了 , 做到一一对应 --no-group-separator
: 当使用'-A', '-B' or '-C'时,不输出任何组分隔符,而是将不同组相邻输出
- 此处将多出的几行
输出样式示例如下
awk '{url=$2;getline;host=$2;printf ("%s\n",host""url)}' > /tmp/url.txt
:url=$2;
先将上述得到的标准输出文本的第一行Host:
字符串的第二段字符串赋值给url(以空格分段) , 如:tgateway.changyou.com
getline;
读取下一行GET /
或POST /
的内容 ,;host=$2;
再将该行的第二段字符串赋值给host , 如:/gateway/cyou/order/query.json?page_no=1&page_size=10&status=&user_id=512001187843600
printf ("%s\n",host""url)}' > /tmp/url.txt
: 将得到的两个变量以host""url
的格式打印至tmp/url.txt
中(""
为空字符串 , 主要用于表达式中分割两个变量)
其他可实现的需求
计算服务器QPS
wc -l /tmp/url.txt | cut -d' ' -f 1
得到一个数字 , 该数字除以统计的秒数即是QPS排除静态文件统计前10访问url:
grep -v -i -E "\.(gif|png|jpg|jpeg|ico|js|swf|css)" /tmp/url.txt | sort | uniq -c | sort -nr | head -n 10
参考资料
- tcpdump: https://www.jianshu.com/p/d9162722f189
- strings: http://ipcmen.com/strings
- awk: https://blog.csdn.net/u010502101/article/details/81839519
- grep: https://www.cnblogs.com/pangbing/p/6535562.html
- 导出文章: http://linux.it.net.cn/e/shell/2014/0706/2390.html
最新文章
- ASP.NET MVC开发:Web项目开发必备知识点
- VS2008控件全部消失
- rhel 7.0, windows10双系统grub2设置
- Ubuntu 下安装 Mysql
- 转载:Qt之界面实现技巧
- 通过SharePoint Designer对SharePoint 2010的Master Page进行自定制
- JQuery:JQuery遍历详解
- @jsonignore的作用
- SQLserver 数据库
- html页面button样式
- windows在文件夹快速打开命令行
- MyEclipse启动时报 Unable to acquire application service. Ensure that the org.eclips
- 一篇非常全面的freemarker教程
- Mongodb启动&;关闭
- Docker: 基础介绍 [一]
- Android studio和Genymotion-VirtualBox的配合使用
- DWR第五篇之文件上传
- .NET Core 管道过滤器扩展
- Eureka的使用
- HDU 5628 Clarke and math——卷积,dp,组合
热门文章
- JavaBean的命名规则
- 【Linux】【Services】【SaaS】Docker+kubernetes(8. 安装和配置Kubernetes)
- SQL Server中修改“用户自定义表类型”问题的分析与方法
- @Conditional 注解,基于条件实例对象
- .Net Core MVC全局过滤器验证是否需要登录
- 为什么重写equals()就要重写hashcode()
- 20个ios登陆界面
- Kafka从入门到放弃(三) —— 详说生产者
- M语言的写、改、删(Power Query 之 M 语言)
- 简单备忘一下Linux下的wget和curl如何使用http proxy