安装步骤:
-
解压后进入文件目录,编译 so文件
gcc -DMYSQL_DYNAMIC_PLUGIN -fPIC -Wall -I/usr/include/mysql -I. -shared lib_mysqludf_sys.c -o lib_mysqludf_sys.so
- 此处需使用 mysql_config --include 查看当前主机的 include 目录。
-
将编译后的 lib_mysqludf_sys.so 拷贝至plugin_dir.
可使用 mysql_config --plugindir 查看插件目录,或者登录mysql,执行SHOW VARIABLES LIKE 'plugin_dir';
- 注意所属用户和权限
-
执行lib_mysqludf_sys.sql里边的sql语句
DROP FUNCTION IF EXISTS lib_mysqludf_sys_info; DROP FUNCTION IF EXISTS sys_get; DROP FUNCTION IF EXISTS sys_set; DROP FUNCTION IF EXISTS sys_exec; DROP FUNCTION IF EXISTS sys_eval; CREATE FUNCTION lib_mysqludf_sys_info RETURNS string SONAME 'lib_mysqludf_sys.so'; CREATE FUNCTION sys_get RETURNS string SONAME 'lib_mysqludf_sys.so'; CREATE FUNCTION sys_set RETURNS int SONAME 'lib_mysqludf_sys.so'; CREATE FUNCTION sys_exec RETURNS int SONAME 'lib_mysqludf_sys.so'; CREATE FUNCTION sys_eval RETURNS string SONAME 'lib_mysqludf_sys.so';
-
来个触发器测试
DELIMITER $$ USE `testsb`$$ DROP TRIGGER /*!50032 IF EXISTS */ `t_working`$$ CREATE /*!50017 DEFINER = 'root'@'%' */ TRIGGER `t_working` BEFORE UPDATE ON `t_tel` FOR EACH ROW BEGIN DECLARE done INT DEFAULT 0; IF new.ACTIVE!=old.ACTIVE THEN SET done = sys_exec("sh /home/working/test.sh"); UPDATE t_working SET working=new.ACTIVE WHERE id=new.wkID; END IF; END; $$ DELIMITER ;
考虑如果黑客攻入数据库,这个sys_exec的权限是不是太大了。查到可以在sudoers 文件中限定普通用户的可执行命令。这里应该是mysql用户执行sys_exec中的命令,如果限定会不会影响mysql服务的运行。
有待测试.