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

これはインターフェイスのポート3306(mysql)でTCPトラフィックをtsharkキャプチャし、mysqlクエリトラフィック()のみをフィルタリングし、mysqlクエリトラフィックのみを出力するように指示します。anymysql.command == 3query

関連情報