linux编译libmysqlclient,在linux下从源码包安装libmysqlcl。。
⼀、从RPM包安装libmysqlclient:
由于数据库服务器安装在xp上,因此,在linux中只需安装mysql的客户端库就可以了。
根据上的《Snort Installation Manual - Snort, MySQL, Redhat 7.3
》中
《snort Installation》⼩节的指导下过来两个包:
MySQL-client-5.0.22-0.i386.rpm
MySQL-devel-5.0.22-0.i386.rpm
键⼊以下命令安装:
#rpm -ivh MySQL-client-5.0.22-0.i386.rpm
#rpm -ivh MySQL-devel-5.0.22-0.i386.rpm
安装好以后,在 /usr/include/mysql/ ⽬录中存放有libmysqlclient的头⽂件mysql.h,在
/usr/lib/mysql/
⽬录中存放有mysql的库⽂件,但只有.a结尾的(即静态库)库⽂件(包括libmysqlclient.a),没有.so(共享库)⽂件。
使⽤如下命令编译⼀个简单的测试程序(代码在本⽂结尾处给出):
#gcc -c -I/usr/include/mysql mysql-test.c
此命令成功⽣成了⽬标⽂件mysql-test.o。
继续键⼊以下命令。
#gcc -o --static mysql-test mysql-test.o -L/usr/lib/mysql
-lmysqlclient
注意参数的顺序,gcc有时会因为某些参数顺序不对⽽报错,某些相关参数的具体顺序应该如何,还望⾼⼈指点。
以上命令确给出了数不清的“引⽤未定义符号”的错误信息,引⽤未定义符号的是libmysqlclient.a
带着希望折腾了许久,最后决定从源码包安装mysql客户端程序库。
卸载MySQL-client与MySQL-devel:
#rpm -e MySQL-client
#rpm -e MySQL-devel
以上两条命令将直接删除rpm -ivh 所释放的所有⽂件及其创建的⽂件夹。
⼆、从源码包安装mysql客户端程序库。
#tar -zxvf mysql-5.0.
(mysql-5.0.位于/root⽬录)
#cd mysql-5.0.22
进⼊mysql-5.0.22⽬录,阅读 INSTALL-SOURCES ⽂件,并看到⼏个关键选项:
1、--without-server
只编译安装客户端程序库,不编译mysql服务器程序,这在本机只需要libmysqlclient时很有⽤。
2、--enable-thread-safe-client
让libmysqlclient中的例程具有线程安全性,要编写多线程的mysql客户端程序时就少不了了,这要求本地拥有多线程库。
3、--prefix 指定安装⽬录
启动configure脚本:
#mkdir /usr/local/mysql
#./configure --without-server --enable-thread-safe-client
--prefix=/usr/local/mysql
⼤概6分钟后,configure脚本⽣成好所有的Makefile后退出。
当前⽬录下执⾏make进⾏编译:
#make
这个过程除了时间长⼀点以外没有别的,⼤概⼀个钟头后make完成编译任务。
安装:
#make install
这个过程也⽐较快,约两三分钟。
安装完成以后,mysql.h⽂件在
/usr/local/mysql/include/mysql/⽬录中(这⾥include⽬录中还有⼀个mysql⼦⽬录)。
以lib开头的库⽂件在/usr/local/mysql/lib/mysql/⽬录中(与mysql.h的情况⼀样,这⾥lib⽬录中还有⼀个mysql⼦⽬录)。此时再来链接测试程序的⽬标⽂件:
#gcc -o mysql-test mysql-test.o -L/usr/lib/mysql
-lmysqlclient
OK,⼀切正常,链接成功。
执⾏⼀下:
#./mysql-test
系统这时⼜发出错误提⽰:Loading libmysqlclient.so.15 Error; No Such
File!
将/usr/local/mysql/lib/mysql/⽬录中的libmysqlclient.so.15.0.0复制到/usr/lib/⽬录下:
#cp /usr/local/mysql/lib/mysql/libmysqlclient.so.15.0.0
/usr/lib/libmysqlclient.so.15
#./mysql-test
屏幕打印出:mysql_init() successed.后就不动了.
约莫90秒后打印libmysqlclient的提⽰信息:Can not connect to mysql
server(110)
这时在windows xp的msdos控制台键⼊:
>netstat -na
看到了系统已经打开了3306端⼝,即mysql server确实在运⾏。
最后注意到xp中启⽤了系统防⽕墙, 禁⽤系统防⽕墙后回到linux的ppty键⼊:
#./mysql-test
这时,黎明的曙光终于出现了,提⽰信息告诉我,它已经连接上了XP中的mysql server。
三、从源码包安装snort2.0
⽬前snort最新版本为2.8,⽐2.0复杂⼀些,感觉刚⼊门的学习或是研究还是2.0好些,结构清晰且功能齐全。进⼊snort2.0源码⽬录之后执⾏:
#./configure --enable-debug
--with-mysql=/usr/local/mysql
--enable-debug 选项将snort编译到调试模式,这对于学习或研究都很有帮助。
--with-mysql=/usr/local/mysql 选项将使snort对mysql提供⽀持。
注意:--with-mysql的值是编译msyql时--prefix指定的路径,⽽⾮libmysqlclient.so所在的路径。
接着执⾏:
#make
#make install
这两个过程很顺利,总时间在10分钟之内。
四、创建snort数据库
在phpmyadmin中创建数据库snort2_0,然后import
/snort-2.0.5/contrib/create_mysql.
phpmyadmin的控制台居然提⽰说sql脚本有语法错误!错误的语句为:
CREATE TABLE schema (
vseq INT UNSIGNED NOT NULL,
ctime DATETIME NOT NULL,
PRIMARY KEY (vseq));
INSERT INTO schema (vseq, ctime) VALUES ('107',
now());
错误的地⽅在表名“schema”附近。查看snort-2.8.1的create_mysql脚本发现其对schema的使⽤
加了“``”号("`"为1左边的键),即修改如下:
CREATE TABLE `schema` (
vseq INT UNSIGNED NOT NULL,
ctime DATETIME NOT NULL,
PRIMARY KEY (vseq));
INSERT INTO `schema` (vseq, ctime) VALUES ('107',
now());
修改完后再试⼀次,果然成功了。但其它的表并没有这样,如:
CREATE TABLE event ( sid
INT
UNSIGNED NOT
NULL,
cid  INT
UNSIGNED NOT
NULL,
signature INT UNSIGNED NOT NULL,
timestamp  DATETIME NOT NULL,
PRIMARY KEY (sid,cid),
INDEX sig (signature),
INDEX time (timestamp));
却没有报错。"schema"是mysql的保留字吗?在查中。
这个问题在snort2.0.5的输出插件中也存在。如下述⽅式启动snort:
#snort -l /root/snort2.0_log -c
/root/snort-2.0.5/f
( f输出插件配置:
#
output database: alert, mysql, user=root
dbname=snort2_0 host=172.16.178.87
# password
注意:如果user指定的数据库⽤户名没有设置密码的话,要将password关键字去掉,否则会出错。)
结果snort在初使化过程中测试数据库时提⽰说schema_VERSION=0,不符合要求,即刻退出。⽽查看schema表中的vseq明明是106。
最后在snort源码⽂件spo_database.c的CheckDBVersion函数中看到以下代码:
mysql下载下来是一个文件夹snprintf(select0, MAX_QUERY_LENGTH, "SELECT vseq FROM
schema");
将其改成:
snprintf(select0, MAX_QUERY_LENGTH, "SELECT vseq FROM
`schema`");
然后回到snort-2.0.5⽬录中执⾏ make uninstall, make, make install
(如果想再从头开始编译,需要执⾏以下⼏条命令
#make uninstall
#make clean
#rm config.cache 或 rm config.status
(根据你的./configure脚本⽣成的⽂件确定)
#./configure
)
再执⾏:
#snort -l /root/snort2.0_log -c
/root/snort-2.0.5/f
这下snort终于在IDS模式中运⾏起来了。⼏分钟后查看snort2_0数据库,发现snort写⼊了许多数据。
五、仍然存在的疑问:
1、mysql server 处理表名为 schema 的查询时所发⽣的现象。
2、linux中如何查询从源码包安装的软件。
⽐如:这⾥的snort,rmp -q snort只提⽰“並未安裝套件 snort”

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。