Mysql安装udf调用系统程序

安装步骤:

  1. 下载地址

  2. 解压后进入文件目录,编译 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 目录。
  3. 将编译后的 lib_mysqludf_sys.so 拷贝至plugin_dir.
    可使用 mysql_config --plugindir 查看插件目录,或者登录mysql,执行

    SHOW VARIABLES LIKE 'plugin_dir';
    
    • 注意所属用户和权限
  4. 执行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';
    
  5. 来个触发器测试

    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 ;
    
  6. 考虑如果黑客攻入数据库,这个sys_exec的权限是不是太大了。查到可以在sudoers 文件中限定普通用户的可执行命令。这里应该是mysql用户执行sys_exec中的命令,如果限定会不会影响mysql服务的运行。
    有待测试.

你可能感兴趣的:(Mysql安装udf调用系统程序)