1.mysql利用mysqludf的一个mysql插件可以实现调用外部程序和系统命令

下载lib_mysqludf_sys程序:https://github.com/mysqludf/lib_mysqludf_sys

2.安装说明:

2.1查询mysql插件路径:

在mysql里查询mysql插件目录的路径:show variables like “plugin_dir”;

2.2解压源码:

将下载下的插件(lib_mysqludf_sys-master.zip)解压后拷贝进/tmp目录下

#cd /tmp
#cd /ib/mysqludf_sys/lib_mysqludf_sys-master/
#ls
Makefile lib_mysqludf_sys.html
install.sh lib_mysqludf_sys.so
lib_mysqludf_sys.c lib_mysqludf_sys.sql
2.3编译源码:

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

# cat Makefile
LIBDIR=/usr/lib install:
gcc -Wall -I/usr/include/mysql -I. -shared lib_mysqludf_sys.c -o $(LIBDIR)/lib_mysqludf_sys.so
#修改后,根据自己的系统环境决定
# cat Makefile
LIBDIR=/usr/lib64/mysql/plugin install:
gcc -fPIC -Wall -I/usr/local/include/mysql -I. -shared lib_mysqludf_sys.c -o $(LIBDIR)/lib_mysqludf_sys.so
# make
gcc -Wall -I/usr/local/include/mysql -I. -shared lib_mysqludf_sys.c -o /usr/lib64/mysql/plugin/lib_mysqludf_sys.so
#说明:不确定需不需要执行这一步,我执行了。有的教程说用,有的没说。
#chcon -t texrel_shlib_t mysql/lib/mysql/plugin/lib_mysqludf_sys.so #备注:
#下面是另一个教程的编译方法,未测试,不知道可以不可以,上面是我自己的编译方法,建议上面的方法(如果用上个编译方法,则不需要再执行下面的编译)
#gcc -DMYSQL_DYNAMIC_PLUGIN -fPIC -Wall -I/usr/include/mysql -I. -shared lib_mysqludf_sys.c -o $(LIBDIR)/lib_mysqludf_sys.so

到这里就已经正常的编译出了.so文件了,可以查看/usr/lib64/mysql/plugin目录下是否有lib_mysqludf_sys.so文件。如果在编译的过程中出现问题,请自行google

2.4创建函数

在mysql中执行下面的命令

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';
2.5测试
2.5.1验证step 1:

在mysql中执行命令

mysql> SELECT sys_exec ('touch /var/lib/mysql/test.txt ');
+---------------------------------------------+
| sys_exec ('touch /var/lib/mysql/test.txt ') |
+---------------------------------------------+
| 32512 |
+---------------------------------------------+
1 row in set (0.00 sec) mysql> SELECT sys_eval('id');
+----------------+
| sys_eval('id') |
+----------------+
| NULL |
+----------------+
1 row in set (0.40 sec) mysql> SELECT sys_eval('cp /home/cassiano/Desktop/index.html /home/cassiano/');
+------------------------------------------------------------------+
| sys_eval('cp /home/cassiano/Desktop/index.html /home/cassiano/') |
+------------------------------------------------------------------+
| |
+------------------------------------------------------------------+
1 row in set (0.02 sec)

从上面的执行结果看出,所有执行都失败了,这是由于apparmor引起(具体原因未知),在shell命令行执行下面的命令

#sudo ln -s /etc/apparmor.d/usr.sbin.mysqld /etc/apparmor.d/disable/
#sudo apparmor_parser -R /etc/apparmor.d/usr.sbin.mysql
2.5.2验证step 2:
mysql> SELECT sys_eval('id');
+-------------------------------------------------+
| sys_eval('id') |
+-------------------------------------------------+
| uid=116(mysql) gid=125(mysql) groups=125(mysql) |
+-------------------------------------------------+
1 row in set (0.09 sec) mysql> SELECT sys_eval('pwd');
+-----------------+
| sys_eval('pwd') |
+-----------------+
| /var/lib/mysql |
+-----------------+
1 row in set (0.01 sec) BUT...
下面的操作失败了... -_-
mysql> SELECT sys_eval('cp /home/cassiano/Desktop/index.html /home/cassiano/');
+------------------------------------------------------------------+
| sys_eval('cp /home/cassiano/Desktop/index.html /home/cassiano/') |
+------------------------------------------------------------------+
| NULL |
+------------------------------------------------------------------+
1 row in set (0.02 sec) mysql> SELECT sys_exec('cp /home/cassiano/Desktop/index.html /home/cassiano/');
+------------------------------------------------------------------+
| sys_exec('cp /home/cassiano/Desktop/index.html /home/cassiano/') |
+------------------------------------------------------------------+
| 256 |
+------------------------------------------------------------------+
1 row in set (0.00 sec)

原因未知,解决办法,在shell中执行下面的命令:

#sudo chown mysql:mysql /home/cassiano/teste/ -R
2.5.3验证step3:

写一个小脚本测试一下:

#cd /tmp
#vi test.sh
#/bin/sh
date > testlog.txt
exit #chmod +x ./test.sh

在mysql中测试:

#mysql
mysql> select sys_exec("/tmp/test.sh");
+--------------------------+
| sys_exec("/tmp/test.sh") |
+--------------------------+
| |
+--------------------------+
row in set (0.03 sec) mysql> select sys_exec("/tmp/test.sh");
+--------------------------+
| sys_exec("/tmp/test.sh") |
+--------------------------+
| |
+--------------------------+
row in set (0.02 sec) mysql> select sys_exec("/tmp/test.sh");
+--------------------------+
| sys_exec("/tmp/test.sh") |
+--------------------------+
| |
+--------------------------+
row in set (0.02 sec) mysql> select sys_exec("/tmp/test.sh");
+--------------------------+
| sys_exec("/tmp/test.sh") |
+--------------------------+
| |
+--------------------------+
row in set (0.02 sec) mysql> exit;

验证是否执行成功:

# cat test.txt
Tue May :: CST
Tue May :: CST
Tue May :: CST
Tue May :: CST
# pwd
/tmp #测试完成。。。成功。。。

3.参考文章

MySQL使用udf调用系统程序
mysql通过函数执行本地命令和外部程序
MySQL UDF执行外部命令
mysql UDF 遇到问题解答
apparmor

最后说明:技术问题,baidu搜索的结果太少,建议google...

MySql UDF 调用外部程序和系统命令的更多相关文章

  1. MySQL 实现调用外部程序和系统命令

    MySQL 实现调用外部程序和系统命令 Refer:http://www.cnblogs.com/yunsicai/p/4080864.html1) Download lib_mysqludf_sys ...

  2. MySQL UDF提权执行系统命令

    目录 UDF UDF提权步骤 UDF提权复现(php环境) UDF UDF (user defined function),即用户自定义函数.是通过添加新函数,对MySQL的功能进行扩充,其实就像使用 ...

  3. Gearman + Nodejs + MySQL UDF异步实现 MySQL 到 Redis 的数据同步

    [TOC] 1, 环境 CentOS, MySQL, Redis, Nodejs 2, Redis简介 Redis是一个开源的K-V内存数据库,它的key可以是string/set/hash/list ...

  4. 【API】Mysql UDF BackDoor

    1.MySQL UDF是什么 UDF是Mysql提供给用户实现自己功能的一个接口,为了使UDF机制起作用,函数必须用C或C ++编写,并且操作系统必须支持动态加载.这篇文章主要介绍UDF开发和利用的方 ...

  5. mysql udf提权实战测试

    根据前天对大牛们的资料学习,进行一次mysql udf提权测试. 测试环境: 受害者系统:centos 7.7 ,docker部署mysql5.6.46, IP:192.168.226.128 攻击者 ...

  6. Java魔法堂:调用外部程序

    前言 Java虽然五脏俱全但总有软肋,譬如获取CPU等硬件信息,当然我们可以通过JNI调用C/C++来获取,但对于对C/C++和Windows API不熟的码农是一系列复杂的学习和踩坑过程.那能不能通 ...

  7. J2EE之oracle、mysql存储过程调用

    最近几天在研究hibernate.JPA对存储过程的调用,主要是针对有返回结果集的存储过程的调用方法,个人感觉存储过程是个好东西,虽然说heibernate对数据访问封装的比较不错,再加上他的缓存机制 ...

  8. C#winform调用外部程序,等待外部程序执行完毕才执行下面代码

    1.简单调用外部程序文件(exe文件,批处理等),只需下面一行代码即可 System.Diagnostics.Process.Start(“应用程序文件全路径”); 2.如果要等待调用外部程序执行完毕 ...

  9. Delphi 调用外部程序并等待其运行结束

    转自:http://blog.csdn.net/xieyunc/article/details/4140620   如何让Delphi调用外部程序并等待其运行结束 1. uses     Window ...

随机推荐

  1. Python3实现火车票查询工具

    Python 实现火车票查询工具 一. 实验介绍 通过python3实现一个简单的命令行版本的火车票查询工具,用实际中的例子会更感兴趣,不管怎么样,既练习了又可以自己使用. 1.  知识点: Pyth ...

  2. Mosquitto搭建Android推送服务(三)Mosquitto集群搭建

    文章钢要: 1.进行双服务器搭建 2.进行多服务器搭建 一.Mosquitto的分布式集群部署 如果需要做并发量很大的时候就需要考虑做集群处理,但是我在查找资料的时候发现并不多,所以整理了一下,搭建简 ...

  3. [转载] Java CheckBoxTree

    代码基本上是copy的.只是在使用上有一些自己的想法. 先上code吧! 虽然别的地方也有.但是还是转一份给自己. 出处:http://blog.csdn.net/joy_125/article/de ...

  4. Echarts 3.19 制作常用的图形 非静态

    最近阿里内部使用的 图表也向外开放了 而百度就好像更有良心一点,Echarts 早就开放了 . 自己学Echarts的时候走了很多的弯路,毕竟谁让自己菜呢,多撞几次南墙才晓得疼 才知道学习方法,新手上 ...

  5. SpringMVC后台接收list类型的数据的实现方式

    一.背景 最近在做一些东西的时候,遇到一个需要Springmvc后台接收list类型数据的需求,几经辗转才完美解决了这个问题,今天记下来方便以后使用,也分享给需要的小伙伴们~ 二.实现方式 1.实现方 ...

  6. Web前端之jQuery 的10大操作技巧

    不管是做什么事情,人们习惯在工作中去找方法.找技巧,来帮助提高效率,在软件开发中更是如此.jQuery作为前端开发必学技术之一,在使用中也有各种各样的小技巧,今天小编为大家分享10条必知会的技巧,希望 ...

  7. Python Virtualenv运行Django环境配置

    系统: RHEL6.5 版本说明: Python-3.5.0 Django-1.10.4 virtualenv:为每个项目建立不同的/独立的Python环境,你将为每个项目安装所有需要的软件包到它们各 ...

  8. jquery Datatables 行数据删除、行上升、行下降功能演示

    Datatables 是一款jquery表格插件.它是一个高度灵活的工具,可以将任何HTML表格添加高级的交互功能. 官方网站:http://www.datatables.net Datatables ...

  9. js厘米与英寸尺码转换

    <style type="text/css"> #txt_cm1, #txt_inch1, #txt_inch2, #txt_cm2 { width: 63px; he ...

  10. mysql 数据库连接超时的问题 autoReconnect=true

    最近在使用spring-jdbc数据库连接管理时,出现一个奇怪问题,当天部署运行没问题,第二天再试就报以下异常问题 org.springframework.dao.RecoverableDataAcc ...