MySQL运行lib_mysqludf_sys实现调用外部程序和系统命令

MySQL环境查询

查询mysql插件目录的路径

show variables like "plugin_dir";

在这里插入图片描述
查看MySQL的位数

show variables like '%version_%';

在这里插入图片描述

lib_mysqludf_sys安装

https://github.com/mysqludf/lib_mysqludf_sys

A UDF library with functions to interact with the operating system. These functions allow you to interact with the execution environment in which MySQL runs.

目录结构如下:
在这里插入图片描述

编译源码

修改Makefile文件, 根据自身系统的MySQL环境而定

原Makefile

LIBDIR=/usr/lib

install:
    gcc -Wall -I/usr/include/mysql -I. -shared lib_mysqludf_sys.c -o $(LIBDIR)/lib_mysqludf_sys.so

修改后Makefile

LIBDIR=/usr/lib/mysql/plugin

install:
    gcc -fPIC -Wall -I/usr/include/mysql -I. -shared lib_mysqludf_sys.c -o $(LIBDIR)/lib_mysqludf_sys.so

执行make,生成新的lib_mysqludf_sys.so

注:源码自带的lib_mysqludf_sys.so为32位

在/usr/lib64/mysql/plugin目录下是否有lib_mysqludf_sys.so,如果mysql是docker环境,采用如下命令:

docker cp lib_mysqludf_sys.so a6e96adf79e2:/usr/lib/mysql/plugin/

创建函数

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';

在这里插入图片描述

错误

ERROR 1126 (HY000): Can’t open shared library ‘lib_mysqludf_sys.so’ (errno: 2 /usr/lib/mysql/plugin/lib_mysqludf_sys.so: wrong ELF class: ELFCLASS32)

查看自带的lib_mysqludf_sys.so文件

file lib_mysqludf_sys.so 

这是在32位系统下编译的lib_mysqludf_sys.so ,而我们的MySQL位数为X86_64
在这里插入图片描述
查看make生成的lib_mysqludf_sys.so文件

file lib_mysqludf_sys.so 

在这里插入图片描述

执行lib_mysqludf_sys

SELECT sys_eval('pwd'); 

在这里插入图片描述

select * from mysql.func;

在这里插入图片描述

发布了72 篇原创文章 · 获赞 66 · 访问量 15万+

猜你喜欢

转载自blog.csdn.net/miaodichiyou/article/details/102566958
今日推荐