Parce que nous développons en utilisant un serveur Mysql
distant, nous ne pouvons donc pas vérifier facilement la requête SQL. Si vous utilisez un serveur local, vous pouvez tail - f general_log_file
pour voir quels sql sont exécutés lorsque vous appelez une interface http. J'ai donc installé une wireshark
pour capturer ces requêtes SQL envoyées du local. Au début, j'utilise mysql local pour le vérifier.
puis j'ai exécuté deux requête SQL dans le terminal mysql
select version();
select now();
mais très décevant, je ne trouve pas ces deux paquets SQL dans Wirehark Je n'ai trouvé que ces quatre paquets.
Mais d'un post je savais
Pour filtrer les paquets mysql, il vous suffit d'utiliser le filtre "mysql" ou "mysql.query! =" "Lorsque vous ne voulez que les paquets demandant une requête. Après cela, vous pouvez ajouter une colonne personnalisée avec le nom de champ «mysql.query» pour obtenir une liste des requêtes exécutées.
et l'effet est comme ça Il est pratique de ne capturer que la requête SQL et d'afficher très clairement ces requêtes SQL. Alors, comment pourrais-je utiliser wireshark
pour implémenter ceci?
salut @ Jeff S.
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 identique à tshark -i lo -Y "mysql.command==3"
et aucune sortie en sortie. 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
...
Vous pouvez utiliser tshark et enregistrer sur un pcap ou simplement exporter les champs qui vous intéressent.
Pour enregistrer sur un pcap (si vous voulez utiliser Wireshark pour l'afficher 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 également utiliser les filtres BPF avec tcpdump (et les filtres de type WireChark Pre Cap). Ils sont plus complexes, mais votre système est moins éprouvant 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:
* Ceci recherche 03 (similaire mysql.command == 3) dans la charge TCP.
** S'agissant d'un filtre relativement lâche, j'ai également ajouté 3306 pour limiter le trafic destiné à ce port . *** Le filtre est basé sur votre capture d'écran. Je ne peux pas le valider maintenant, alors laissez-moi savoir si cela ne fonctionne pas.
Réponses utiles: https://serverfault.com/questions/358978/how-to-capture-the-queries-run-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:
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.=" $_";
}
}'
L’outil Wireshark prend en charge le protocole MySQL: https://www.wireshark.org/docs/dfref/m/mysql.html
Puis config Wirehark
a.menu Analyze --> Decode as --> add "field=tcp_port value=3306 current=MySQL"
b.filter ‘mysql‘ or ‘mysql.query != “”‘
J'ai essayé une autre commande tshark
de this post , et il pourrait capturer la requête SQL du serveur mysql local au serveur distant.
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 il produit également des lignes vierges entre ces sql. J'ai essayé ci-dessous la commande veux supprimer la ligne vide 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 pas prendre en charge la capture de la requête SQL vers un mysql local (5.7.12
).
tshark -i lo -d tcp.port==3306,mysql -T fields -e mysql.query 'port 3306'
Capturing on 'Loopback'
Aucune sortie sauf des lignes vides.