2016-07-03 6 views
5

リモートサーバーMysqlを使用して開発しているため、ローカルサーバーを使用している場合は簡単にクエリーSQLを確認できないため、を実行して、そこで私はwiresharkをインストールして、これらのクエリSQLをローカルから送信するようにしました。最初に、ローカルのmysqlを使って検証します。wiresharkを使用してmysql query sqlを明確に取得する方法

キャプチャフィルタはenter image description here

が、私はmysqlの端末に2つのクエリのSQLを実行している

select version(); 
select now(); 

が、私は、私はこれらのみ4を発見した enter image description here のwiresharkでこれらの2つのSQLのパケットを見つけることができません非常に残念パケット。

しかし、私はあなただけのフィルター「のmysql」または使用mysqlのパケットフィルタリングするに

を知っていた「mysql.queryを!= 『』」あなただけのクエリを要求するパケットをしたいときのポストから。その後、フィールド名 'mysql.query'を持つカスタム列を追加して、実行された場所の一覧を表示することができます。

とそれだけでクエリのSQLをキャプチャするために便利だし、非常に明確にこれらのクエリのSQLを表示 enter image description here 、このような効果があります。では、これを実装するには、どうすれば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 

tshark -i lo0 -Y "mysql.command==3" -T fields -e mysql.query

の下には tshark -i lo -Y "mysql.command==3"も何も出力と同じである参照してください。しかし、私は唯一の tshark -i lo0を使用している場合、それはあなたがtsharkのを使用してPCAPに保存したり、ちょうどあなたが興味を持っているフィールドをエクスポートすることができます。

のpcapに保存する(したい場合は、出力

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 
... 
+0

これはまさにそれを行う必要があります。これをフィルタに入力するとどうなりますか?表示列はフィルタによって変更されます。 – Solarflare

答えて

6

を持っています)後に表示するの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) 

テキストファイルに保存するには:

tshark -i lo -Y "mysql.command==3" -T fields -e mysql.query > output.txt 

することができますまた、tcpdump(およびwiresharkプリキャップフィルタ)を使用してBPFフィルタを使用します。それらはより複雑ですが、多くのトラフィックをキャプチャしている場合はシステムに負荷がかかりません。

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

注:
*これは、TCPペイロード内の03(同様のmysql.commandの== 3)を探します。
**これは非常に緩やかなフィルタなので、3306を追加して、そのポート宛のトラフィックだけに制限しました。 ***フィルタはスクリーンショットに基づいています。今すぐ検証することはできませんので、動作しない場合はお知らせください。

出力例:Sample output from two commands

+0

私はあなたの方法を試しましたが、それは成功ではありません。私のポストを見てください。 – zhuguowei

+0

私はそれを試しただけで、それは私のために働いた。どのバージョンのtsharkを使用していますか?上記の私の答えをスクリーンショットで編集しました。 –

+0

ありがとう! tsharkバージョン: 'tshark -v TShark(Wireshark)2.0.4(マスター2.0からのv2.0.4-0-gdd7746e)'; mysqlバージョン:5.7.12; Mac OS X EI Capitanバージョン10.11.5 – zhuguowei

1

私はthis postから別のtsharkコマンドを試みたが、それはローカルからリモートのMySQLサーバへのクエリのSQLをキャプチャすることができます。

tshark -i en0 -d tcp.port==3306,mysql -T fields -e mysql.query 'port 3306' 
Capturing on 'Wi-Fi' 
select version() 


select now() 


select rand() 

ただし、これらのsqlの間には空白行がいくつか出力されます。私は、空白行を削除するコマンドの下にしようとしたが、ローカルのMySQL(5.7.12)にクエリのSQLをキャプチャサポートすることはできません

tshark -i en0 -d tcp.port==6006,mysql -Y "frame.len>10" -T fields -e mysql.query 'port 6006' 

そして、残念ながら、このコマンドは失敗しました。

tshark -i lo -d tcp.port==3306,mysql -T fields -e mysql.query 'port 3306' 
Capturing on 'Loopback' 

空白行以外の出力はありません。ここ

+0

コマンドが単なるクエリアのためにフィルタリングされていないため、空白行が表示されています。また、en0でこのトラフィックを見ているように見えるので、これを試してみてください:tshark -i en0 -Y "mysql.command == 3" -T fields -e mysql.query –

+0

ありがとう!何も出力しないでください。私のマシンではtsharkで正しく解決できないようです。 – zhuguowei

1

便利な答え:特に https://serverfault.com/questions/358978/how-to-capture-the-queries-run-on-mysql-server

:のSoMoSparkyの答え:

tshark -T fields -R mysql.query -e mysql.query 

とのuser1038090の答え:

tcpdump -i any -s 0 -l -vvv -w - dst port 3306 | strings | perl -e ' 
while(<>) { chomp; next if /^[^ ]+[ ]*$/; 
    if(/^(SELECT|UPDATE|DELETE|INSERT|SET|COMMIT|ROLLBACK|CREATE|DROP|ALTER)/i) { 
    if (defined $q) { print "$q\n"; } 
    $q=$_; 
    } else { 
    $_ =~ s/^[ \t]+//; $q.=" $_"; 
    } 
}' 
関連する問題