2016-07-03 1 views
5

Parce que nous développons en utilisant le serveur distant Mysql, donc ne peut pas vérifier query sql facilement, si vous utilisez le serveur local, vous pouvez tail - f general_log_file pour voir quels sql sont exécutées lors de l'appel de l'interface http. J'ai donc installé un wireshark pour capturer ces requêtes sql send de local. Au début, j'utilise mysql local pour le vérifier.Comment utiliser wireshark pour capturer mysql query sql clairement

Le filtre de capture est enter image description here

j'exécuté deux requête SQL dans le terminal mysql

select version(); 
select now(); 

mais très décevant, je ne peux pas trouver ces deux paquets sql Wireshark enter image description here Je ne ai trouvé ces quatre paquets.

Mais d'un poste que je connaissais

Pour filtrer les paquets mysql vous suffit d'utiliser le filtre « mysql » ou « mysql.query! = « » » Si vous voulez que les paquets qui demandent une requête. Après cela, vous pouvez ajouter une colonne personnalisée avec le nom de champ 'mysql.query' pour avoir une liste de requêtes exécutées.

et l'effet est comme celui-ci enter image description here Il est commode de ne capturer que requête SQL et très clairement affiché ces requête SQL. Alors, comment pourrais-je utiliser wireshark pour implémenter cela?


salut S. @ Jeff

J'ai essayé votre commande, s'il vous plaît voir ci-dessous

#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 

et tshark -i lo0 -Y "mysql.command==3" -T fields -e mysql.query est de même avec tshark -i lo -Y "mysql.command==3" également une sortie rien. Mais si je n'utilise que tshark -i lo0, il a une sortie

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

C'est exactement ce que vous avez à faire. Que se passe-t-il si vous entrez ceci dans votre filtre? Les colonnes d'affichage changeront avec votre filtre. – Solarflare

Répondre

6

Vous pouvez utiliser tshark et enregistrer dans un PPCE ou tout simplement exporter les champs qui vous intéressent.

Pour enregistrer un PPCE (si vous voulez d'utiliser Wireshark pour voir plus tard):

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) 

pour enregistrer dans un fichier texte:

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

Vous pouvez utilisez également les filtres BPF avec tcpdump (et les filtres wireshark pre cap). Ils sont plus complexes, mais moins coûteux sur votre système si vous capturez beaucoup de trafic.

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

REMARQUE:
* Cela ressemble à 03 (similaire mysql.command == 3) dans la charge utile TCP.
** Puisqu'il s'agit d'un filtre assez lâche, j'ai également ajouté 3306 pour restreindre uniquement au trafic destiné à ce port. *** Le filtre est basé sur votre capture d'écran. Je ne peux pas le valider pour le moment, alors laissez-moi savoir si cela ne fonctionne pas.

Résultat: Sample output from two commands

+0

J'ai essayé votre chemin, mais ce n'est pas un succès. S'il vous plaît voir mon message. – zhuguowei

+0

Je viens de l'essayer et ça a marché pour moi. Quelle version de tshark utilisez-vous? J'ai édité ma réponse ci-dessus avec une capture d'écran. –

+0

Merci! version tshark: 'tshark -v TShark (Wireshark) 2.0.4 (v2.0.4-0-gdd7746e de maître-2.0)'; version mysql: 5.7.12; Mac OS X EI Capitan version 10.11.5 – zhuguowei

1

j'ai essayé une autre commande de tsharkthis post, et il pourrait capturer sql de requête du niveau local au serveur distant mysql.

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() 

mais également de produire des lignes vides entre ces sql. J'ai essayé ci-dessous commande souhaitez supprimer la ligne blanche, mais a échoué

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

Et malheureusement, cette commande ne peut prendre en charge la capture requête SQL à MySQL locale (5.7.12).

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

Aucune sortie à l'exception des lignes vides.

+0

Vous voyez des lignes vides car la commande ne filtre pas uniquement les interrogateurs. Il semble aussi que vous voyez maintenant ce trafic sur en0 plutôt que sur lo alors essayez ceci: tshark -i en0 -Y "mysql.command == 3" -T champs -e mysql.query –

+0

Merci! mais utilisez votre façon de rien sortie. Il semble que tshark ne puisse pas le résoudre correctement dans ma machine. – zhuguowei

1

réponses utiles ici: https://serverfault.com/questions/358978/how-to-capture-the-queries-run-on-mysql-server

En particulier: la réponse de SoMoSparky de:

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

et la réponse de user1038090 de:

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.=" $_"; 
    } 
}'