2016-07-03 20 views
5

Poiché sviluppiamo utilizzando il server remoto Mysql, quindi non è possibile controllare facilmente query sql, se si utilizza il server locale è possibile tail - f general_log_file per vedere quali SQL vengono eseguiti quando si chiama qualche interfaccia http. Così ho installato un wireshark per catturare queste query SQL invia da locale. Inizialmente utilizzo mysql locale per verificarlo.Come usare wireshark per acquisire mysql query sql chiaramente

Il filtro di cattura è enter image description here

poi eseguite due query SQL terminale mysql

select version(); 
select now(); 

ma molto deludente non riesco a trovare queste due pacchetti SQL in wireshark enter image description here ho trovato questi quattro solo pacchetti.

Ma da un post che ho saputo

Per filtrare i pacchetti MySQL è sufficiente utilizzare il filtro ‘mysql’ o ‘mysql.query! =‘’’ Quando si desidera solo i pacchetti che richiedono una query. Successivamente è possibile aggiungere una colonna personalizzata con il nome del campo 'mysql.query' per avere un elenco di query che sono state eseguite.

e l'effetto è come questo enter image description here E 'conveniente per catturare solo query SQL e molto visualizzata chiaramente queste query SQL. Quindi, come posso usare wireshark per implementarlo?


hi @Jeff S.

ho provato il vostro comando, si prega di vedere sotto

#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 

e tshark -i lo0 -Y "mysql.command==3" -T fields -e mysql.query è lo stesso con tshark -i lo -Y "mysql.command==3" anche l'uscita nulla. Ma se io uso solo tshark -i lo0, ha uscita

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

Questo è esattamente come si deve fare. Cosa succede se inserisci questo nel tuo filtro? Le colonne del display cambieranno con il tuo filtro. – Solarflare

risposta

6

È possibile utilizzare tshark e salvare in un pcap o semplicemente esportare i campi che ti interessa.

Per salvare ad un pcap (se si desidera utilizzare Wireshark per vedere più avanti):

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) 

per salvare un file di testo:

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

Puoi utilizzare anche i filtri BPF con i filtri tcpdump (e wireshark pre-cap). Sono più complessi, ma meno gravosi sul tuo sistema se stai catturando molto traffico.

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

NOTA:
* Questo sembra per 03 (simile mysql.command == 3) all'interno del payload TCP.
** Poiché si tratta di un filtro piuttosto allentato, ho anche aggiunto 3306 per limitare il traffico destinato a quella porta. *** Il filtro è basato sul tuo screenshot. Non posso confermarlo in questo momento, quindi fammi sapere se non funziona.

Esempio di output: Sample output from two commands

+0

Ho provato a modo tuo, ma non è un successo. Si prega di consultare il mio post. – zhuguowei

+0

Ho appena provato e ha funzionato per me. Quale versione di tshark stai usando? Ho modificato la mia risposta sopra con uno screenshot. –

+0

Grazie! versione di tshark: 'tshark -v TShark (Wireshark) 2.0.4 (v2.0.4-0-gdd7746e da master-2.0)'; versione mysql: 5.7.12; Mac OS X EI Capitan versione 10.11.5 – zhuguowei

1

ho provato un altro comando tshark da this post, e potrebbe catturare query SQL dal locale al server mysql remoto.

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

ma anche uscita alcune righe vuote tra questi sql. Ho provato sotto il comando desidera rimuovere riga vuota ma non è riuscito

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

E purtroppo questo comando non può sostenere l'acquisizione di query SQL per mysql locale (5.7.12).

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

Niente output eccetto righe vuote.

+0

Stai vedendo le righe vuote perché il comando non sta filtrando solo per i querier. Sembra che tu stia vedendo questo traffico su en0 invece di farlo, prova questo: tshark -i en0 -Y "mysql.command == 3" -T campi -e mysql.query –

+0

Grazie! ma usa la tua strada niente output. Sembra che tshark non possa risolverlo correttamente nella mia macchina. – zhuguowei

1

risposte utili qui: https://serverfault.com/questions/358978/how-to-capture-the-queries-run-on-mysql-server

In particolare: la risposta di SoMoSparky di:

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

e la risposta di user1038090 di:

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