[20140212]linux下使用tcpdump抓取sql语句

简介: [20140212]linu下使用tcpdump抓取sql语句.txt 我们生产系统问题多多,经常要跟踪用户执行的sql语句,当出现问题时要跟踪比较麻烦,我需要一个快捷的方式"看到"用户执行的sql语 句,想到了tcpdump抓包软件。

[20140212]linu下使用tcpdump抓取sql语句.txt

我们生产系统问题多多,经常要跟踪用户执行的sql语句,当出现问题时要跟踪比较麻烦,我需要一个快捷的方式"看到"用户执行的sql语
句,想到了tcpdump抓包软件。

我测试建立shell脚本如下:

#! /bin/bash
/usr/sbin/tcpdump -l -i eth0 -s 16384 -A -nn src host $1 and dst port 1521

--说明:
-- -l     Make stdout line buffered.  Useful if you want to see the data while capturing it.  E.g.,
          ''tcpdump  -l  |  tee dat'' or ''tcpdump  -l   > dat  &  tail  -f  dat''.
--这样可以立即看到包。不然要等待缓存,可能漏掉一些sql语句。
-- -i     指网络接口。
-- -s     抓包长度,这个设置多少我还真不知道,我乱写为16384
-- -A     Print each packet (minus its link level header) in ASCII.  Handy for capturing web pages.

--- 执行很简单,参数使用ip地址就ok了。

Tcpdumpsql ip_address

很明显抓取的东西有一些乱。虽然sql语句也在里面,但是显示太乱了。想到了一些过滤命令grep等等。但是如果sql语句太长,这样也不
是很好。我开始google看看是否有人写一些相似的命令,输入tcpdump oracle

http://appcrawler.com/wordpress/2012/08/01/tcpdump-to-see-oracle-errors/

他使用tcpdump抓取oracle错误。在其网站检索发现:
http://appcrawler.com/wordpress/2012/11/09/tracing-sql-across-the-wire/

这个正是我需要的。

按照以上脚本修改如下:

# cat /usr/local/bin/Tcpdumpsql
#! /bin/bash
/usr/sbin/tcpdump -l -i eth0 -s 16384 -A -nn src host $1 and dst port 1521 |  sed  -u -e  "s/^\.*//;s/\.*$//" | \
awk '{if (tolower($0) ~ "select" || tolower($0) ~ "update" ||  tolower($0) ~ "delete") {p=1;print} \
else if(p == 1 && $0 !~ "^[0-9][0-9]:") {print} else if ($0 ~ "^[0-9][0-9]:") {p=0}}'

--前面的. 实际上前面含有^M。修改如下ok了。

#! /bin/bash
/usr/sbin/tcpdump  -l -i eth0 -s 16384 -A -nn src host $1 and dst port 1521 2>/dev/null | sed -u -e  "s/^M/!/g;s/^E\.\..\{1,100\}//;s/\.*$//;s/^\.*//" | \
awk '{if (tolower($0) ~ "select" || tolower($0) ~ "update" ||  tolower($0) ~ "delete" || tolower($0) ~ "insert" ) {p=1;print} \
else if(p == 1 && $0 !~ "^[0-9][0-9]:") {print} else if ($0 ~ "^[0-9][0-9]:") {p=0}}'

--^M 输入要ctrl+v ctrl+m.

顺便测试alter session set cursor_sharing=force ;转换成绑定在那里发生:

alter session set cursor_sharing=force ;
select * from dept where deptno= 30;

截取sql如下:
#select * from dept where deptno= 30

--保持原样,可见转换在服务器端完成。

前面的#实际上sql语句的长度指示器。

select dump('#') from dual ;
DUMP('#')
-------------------
Typ=96 Len=1: 35

select length('select * from dept where deptno= 30') from dual ;
LENGTH('SELECT*FROMDEPTWHEREDEPTNO=30')
---------------------------------------
                                     35
--sql语句长度35,正好合适。

如果很长FF+sql语句+FF+sql语句+剩下长度+sql语句,这样截取的可能有不需要的字符。不过仅仅拿来看个大概,基本没有问题。还有一些前面可能出现\n,这样转换可能存在一些问题,
总体满足自己的需要。

目录
相关文章
|
4月前
|
网络协议 Linux
linux tcpdump 使用小结(二)
linux tcpdump 使用小结(二)
34 1
|
3月前
|
监控 网络协议 Linux
在Linux中,如何实时抓取并显示当前系统中tcp 80 端口的网络数据信息?
在Linux中,如何实时抓取并显示当前系统中tcp 80 端口的网络数据信息?
|
3月前
|
存储 监控 网络协议
在Linux中,如何使用 tcpdump 监听主机为 192.168.1.1,tcp 端⼝为 80 的数据,并将将输出结果保存输出到tcpdump.log?
在Linux中,如何使用 tcpdump 监听主机为 192.168.1.1,tcp 端⼝为 80 的数据,并将将输出结果保存输出到tcpdump.log?
|
3月前
|
存储 运维 安全
在Linux中,如何使用tcpdump和tshark进行实时数据包捕获?
在Linux中,如何使用tcpdump和tshark进行实时数据包捕获?
|
3月前
|
Linux 数据库 数据安全/隐私保护
|
4月前
|
运维 监控 网络协议
Linux抓包命令tcpdump使用技巧大全
【7月更文挑战第10天】
127 5
Linux抓包命令tcpdump使用技巧大全
|
4月前
|
Linux
linux tcpdump 使用小结(一)
linux tcpdump 使用小结(一)
51 10
|
3月前
|
存储 Linux 网络安全
【Azure 应用服务】App Service For Linux 如何在 Web 应用实例上住抓取网络日志
【Azure 应用服务】App Service For Linux 如何在 Web 应用实例上住抓取网络日志
|
3月前
|
监控 网络协议 Linux
在Linux中,如何使用 tcpdump 嗅探 80 端口的访问看看谁最⾼?
在Linux中,如何使用 tcpdump 嗅探 80 端口的访问看看谁最⾼?
|
3月前
|
SQL 监控 安全
在Linux中,如何检测和防止SQL注入和跨站脚本(XSS)攻击?
在Linux中,如何检测和防止SQL注入和跨站脚本(XSS)攻击?