strings 명령은 일부 추가 문자를 인쇄합니다.

strings 명령은 일부 추가 문자를 인쇄합니다.

tcpdump를 사용하여 mysql 트래픽을 캡처하고 strings명령을 사용하여 이를 텍스트로 변환하려고 하는데 mysql 트래픽을 캡처하는 동안 각 문자 끝에 추가 문자가 표시됩니다. 이유를 알 수 없습니다.

예를 들어

CREATE TABLE foo1.foo (id INTEGER, name VARCHAR(20))H>

보시다시피 H>쿼리 끝에 . 누구든지 이 문제를 해결하도록 도와줄 수 있나요?

편집하다:트래픽을 캡처하기 위해 다음 명령을 실행하고 있습니다.

$ sudo tcpdump -i any -s 0 -l -w - dst port 3306 | stdbuf -i0 -o0 -e0 strings -12

답변1

mysql프로토콜은 텍스트 프로토콜이 아니므로 이진수로 표현된 문자열과 숫자가 교환됩니다. 숫자를 구성하는 바이트가 해당 로케일에서 인쇄 가능한 문자와 일치하는 것으로 나타나면 다음과 같이 표시됩니다 strings.

비록 그것이텍스트프로토콜을 사용하는 경우 쿼리 뒤에는 캡처된 다음 이더넷 프레임이 시작됩니다. 여기서 pcap 헤더에는 로케일에서 인쇄 가능한 문자와 일치하는 바이트 값이 포함될 가능성이 높습니다. 일반적으로 pcap 헤더의 처음 4바이트는 캡처 시간이며 기본 바이트 순서의 32비트 숫자로 표시됩니다. 예를 들어 현재 Unix 시간은 0x51f65c79이며 x86 PC에서는 0x79(ASCII y), 0x5c(ASCII 백슬래시), 0xfc, 0x51(ASCII ) 바이트로 저장되며 q이는 아마도 MySQL에서 볼 수 있는 것과 같습니다 query. 텍스트 자체는 콘텐츠 패킷의 마지막에 나타납니다.

또한 긴 쿼리는 여러 TCP 패킷으로 분할될 수 있으며 해당 로캘에서 인쇄할 수 없는 문자가 포함될 수 있다는 점을 명심하세요.

mysql 프로토콜을 구문 분석할 수 있는 것을 사용해야 합니다 tshark. 예를 들면 다음과 같습니다.

tshark -T fields -e 'mysql.query' -i any -R 'mysql.command == 3' tcp port mysql

이는 인터페이스의 포트 3306(mysql)에서 TCP 트래픽을 tshark캡처하고 , mysql 쿼리 트래픽( )만 필터링하고, mysql 쿼리 트래픽만 출력하도록 지시합니다.anymysql.command == 3query

관련 정보