我正在尝试使用 tcpdump 捕获 mysql 流量并使用strings
命令将其转换为文本,但是在捕获 mysql 流量时,我在每个字符的末尾得到一些额外的字符。我无法找出原因。
例如
CREATE TABLE foo1.foo (id INTEGER, name VARCHAR(20))H>
如您所见,H>
查询末尾有。有人可以帮我解决这个问题吗?
编辑:我正在运行以下命令来捕获流量。
$ sudo tcpdump -i any -s 0 -l -w - dst port 3306 | stdbuf -i0 -o0 -e0 strings -12
答案1
该mysql
协议不是文本协议,因此将交换以二进制表示的字符串和数字。如果组成数字的字节看起来与您的语言环境中的可打印字符匹配,它们将显示为strings
。
即使它是一个文本协议中,查询后面将是下一个捕获的以太网帧的开始,其中的 pcap 标头很可能包含与您的语言环境中的可打印字符相匹配的字节值。通常,pcap 标头的前 4 个字节是捕获时间,以本地字节序表示为 32 位数字。例如,当前的 Unix 时间是 0x51f65c79,在 x86 PC 上将存储为这些字节:0x79(ASCII y
)、0x5c(ASCII 反斜杠)、0xfc、0x51(ASCII q
),这可能是您在 MySQL 中看到的内容query
数据包中,查询文本本身是最后出现的。
另请记住,长查询可能会分成多个 TCP 数据包,并且可能包含在您的语言环境中无法打印的字符。
你应该使用能够解析 mysql 协议的东西,例如tshark
:
tshark -T fields -e 'mysql.query' -i any -R 'mysql.command == 3' tcp port mysql
这告诉tshark
捕获any
接口上端口 3306 (mysql) 上的 TCP 流量,仅过滤 mysql 查询流量 ( mysql.command == 3
),并输出query
唯一的。