2016-07-03 29 views
5

Ponieważ rozwijamy się za pomocą zdalnego serwera Mysql, więc nie można łatwo sprawdzić kwerendy sql, jeśli użyjesz lokalnego serwera, możesz tail - f general_log_file sprawdzić, które sql są wykonywane po wywołaniu jakiegoś interfejsu http. Zainstalowałem więc wireshark, aby przechwycić kwerendy wysyłane przez sql z lokalnego. Najpierw używam lokalnego mysql, aby to zweryfikować.Jak korzystać z wireshark do przechwytywania zapytania sql mysql wyraźnie

Filtr przechwytywania jest enter image description here

potem wykonywane dwa SQL Query w terminalu mysql

select version(); 
select now(); 

ale bardzo rozczarowujące, nie mogę znaleźć tych dwóch sql pakietów w Wireshark enter image description here Znalazłem tylko te cztery pakiety.

Ale z postu Wiedziałem

Aby odfiltrować pakiety mysql po prostu użyć filtru „mysql” lub „mysql.query! =«»”, Kiedy tylko chcą pakiety żądających zapytania. Następnie możesz dodać niestandardową kolumnę z nazwą pola "mysql.query", aby wyświetlić listę zapytań, które zostały wykonane.

a efekt jest jak ten enter image description here jest to wygodne, aby uchwycić tylko SQL Query i bardzo wyraźnie wyświetlanego te sql zapytania. Więc jak mogę użyć wireshark do zaimplementowania tego?


hi @Jeff S.

Próbowałem swoje polecenia, proszę zobaczyć poniżej

#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 

i tshark -i lo0 -Y "mysql.command==3" -T fields -e mysql.query to samo z tshark -i lo -Y "mysql.command==3" także wyjście nic. Ale jeśli mogę użyć tylko tshark -i lo0, to posiada wejście

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

Dokładnie tak trzeba to zrobić. Co się stanie, jeśli wpiszesz to w swoim filtrze? Kolumny wyświetlania zmienią się wraz z filtrem. – Solarflare

Odpowiedz

6

Można użyć tshark i zapisać do pcap lub po prostu wyeksportować pola, które Cię interesują.

Aby zapisać się do pcap (jeśli chcesz używać Wireshark aby później):

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) 

aby zapisać do pliku tekstowego:

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

można używaj również filtrów BPF z tcpdump (i filtrami wstępnymi Wireshark). Są bardziej złożone, ale mniej obciążają twój system, jeśli przechwytujesz duży ruch.

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

UWAGA:
* wygląda to na 03 (podobnie mysql.command == 3) w bloku danych TCP.
** Ponieważ jest to całkiem luźny filtr, dodałem także 3306, aby ograniczyć się do ruchu przeznaczonego tylko dla tego portu. *** Filtr jest oparty na zrzucie ekranu. Nie mogę go teraz zweryfikować, więc daj mi znać, jeśli to nie zadziała.

Przykład wyjściowa: Sample output from two commands

+0

Próbowałem twojej drogi, ale to nie jest sukces. Zobacz mój post. – zhuguowei

+0

Po prostu wypróbowałem i zadziałało. Którą wersję tshark używasz? Edytowałem swoją odpowiedź powyżej za pomocą zrzutu ekranu. –

+0

Dzięki! Wersja tshark: 'tshark -v TShark (Wireshark) 2.0.4 (v2.0.4-0-gdd7746e z master-2.0)'; mysql wersja: 5.7.12; Mac OS X EI Capitan wersja 10.11.5 – zhuguowei

1

Próbowałem innego polecenia tshark z this post, a to może przechwytywać zapytania sql od lokalnego do zdalnego serwera 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() 

ale również wyprowadza kilka pustych linii między tymi sql. Próbowałem poniżej polecenia chcesz usunąć pustą linię, ale nie udało

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

i niestety tego polecenia nie obsługuje przechwytywania zapytań SQL do lokalnej mysql (5.7.12).

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

Nic wyjściowego oprócz pustych linii.

+0

Wyświetlane są puste wiersze, ponieważ polecenie nie filtruje tylko w przypadku kwerend. Wygląda na to, że widzisz teraz ten ruch na en0, a nie lo, więc spróbuj tego: tshark -i en0 -Y "mysql.command == 3" -T pola -e mysql.query –

+0

Dzięki! ale używaj po swojemu nic wyjścia. Wygląda na to, że tshark nie może go poprawnie rozwiązać na moim komputerze. – zhuguowei

1

Przydatne odpowiedzi tutaj: https://serverfault.com/questions/358978/how-to-capture-the-queries-run-on-mysql-server

W szczególności: odpowiedź SoMoSparky z dnia:

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

i odpowiedź user1038090 z dnia:

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