strings 命令打印一些额外的字符

strings 命令打印一些额外的字符

我正在尝试使用 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唯一的。

相关内容