如何使用wireshark清楚地捕获mysql查询sql

zhu*_*wei 9 mysql wireshark tshark

因为我们使用远程Mysql服务器开发,所以不能轻易检查查询sql,如果使用本地服务器你可以tail - f general_log_file在调用一些http接口时查看执行哪些sql.所以我安装了一个wireshark来捕获这些查询从本地发送的sql.起初我使用本地mysql来验证它.

捕获过滤器是 在此输入图像描述

然后我在mysql终端中执行了两个查询sql

select version();
select now();
Run Code Online (Sandbox Code Playgroud)

但非常令人失望我在wireshark中找不到这两个sql包 在此输入图像描述 我只发现了这四个包.

但是从我知道的帖子中

要过滤掉mysql数据包,只需使用过滤器'mysql'或'mysql.query!=""',只需要请求查询的数据包.之后,您可以添加一个字段名称为"mysql.query"的自定义列,以获取执行位置的查询列表.

效果是这样的 在此输入图像描述 只捕获查询sql很方便,并且非常清楚地显示了这些查询sql.那我怎么wireshark用来实现呢?


你好@Jeff S.

我试过你的命令,请看下面

#terminal 1
tshark -i lo0 -Y "mysql.command==3"
Capturing on 'Loopback'

# terminal 2
mysql -h127.0.0.1 -u root -p
select version();
#result: nothing output in terminal 1
Run Code Online (Sandbox Code Playgroud)

tshark -i lo0 -Y "mysql.command==3" -T fields -e mysql.query一样的是tshark -i lo -Y "mysql.command==3"也没什么输出.但如果我只使用tshark -i lo0它,它有输出

Capturing on 'Loopback'
 1   0.000000    127.0.0.1 -> 127.0.0.1    TCP 68 57881 ? 3306 [SYN] Seq=0 Win=65535 Len=0 MSS=16344 WS=32 TSval=1064967501 TSecr=0 SACK_PERM=1
 2   0.000062    127.0.0.1 -> 127.0.0.1    TCP 68 3306 ? 57881 [SYN, ACK] Seq=0 Ack=1 Win=65535 Len=0 MSS=16344 WS=32 TSval=1064967501 TSecr=1064967501 SACK_PERM=1
 3   0.000072    127.0.0.1 -> 127.0.0.1    TCP 56 57881 ? 3306 [ACK] Seq=1 Ack=1 Win=408288 Len=0 TSval=1064967501 TSecr=1064967501
 4   0.000080    127.0.0.1 -> 127.0.0.1    TCP 56 [TCP Window Update] 3306 ? 57881 [ACK] Seq=1 Ack=1 Win=408288 Len=0 TSval=1064967501 TSecr=1064967501
...
Run Code Online (Sandbox Code Playgroud)

Jef*_* S. 7

您可以使用tshark并保存到pcap或只导出您感兴趣的字段.

要保存到pcap(如果您想使用wireshark稍后查看):

tshark -i lo -Y "mysql.command==3" -w outputfile.pcap
tshark -i lo -R "mysql.command==3" -w outputfile.pcap
-R is deprecated for single pass filters, but it will depend on your version
-i is interface so replace that with whatever interface you are using (e.g -i eth0)
Run Code Online (Sandbox Code Playgroud)

要保存到文本文件:

tshark -i lo -Y "mysql.command==3" -T fields -e mysql.query > output.txt
Run Code Online (Sandbox Code Playgroud)

您还可以将BPF过滤器与tcpdump(以及wireshark前置过滤器)一起使用.它们更复杂,但如果您捕获大量流量,则会减少对系统的负担.

sudo tcpdump -i lo "dst port 3306 and  tcp[(((tcp[12:1]&0xf0)>>2)+4):1]=0x03" -w outputfile.pcap
Run Code Online (Sandbox Code Playgroud)

注意:
*这将在TCP有效负载中查找03(类似mysql.command == 3).
**由于这是一个相当宽松的过滤器,我还添加了3306以限制只发往该端口的流量.***过滤器基于您的屏幕截图.我现在无法验证它,所以让我知道它是否不起作用.

示例输出: 两个命令的示例输出