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;

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章