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

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

Refer:

http://www.cnblogs.com/yunsicai/p/4080864.html

1) Download lib_mysqludf_sys

$ git clone https://github.com/mysqludf/lib_mysqludf_sys.git

2) get mysql plugin dir as LIBDIR:

mysql > show variables like ‘plugin_dir‘;

+--------------+--------------------------+
|variable_name |           value          |
+--------------+--------------------------+
| plugin_dir   |  /usr/lib64/mysql/plugin |
+--------------+--------------------------+

3) Modify Makefile as below:  编译64位的so

LIBDIR=/usr/lib64/mysql/plugin

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

4) If need, install:

$ apt-get install libmysqlclient-dev

5) Compile on the mysql linux server:

$ sudo make install

That will generate and copy lib_mysqludf_sys.so into $(LIBDIR)

**********************************************************************************************

或者省去上面的步骤,直接下载:

ftp://pub:[email protected]/tarball/lib_mysqludf_sys.tar.gz

里面包括了已经编译好的64位 lib_mysqludf_sys.so,仅仅要拷贝到 plugin_dir 文件夹下就可以。

**********************************************************************************************

6) Install the library ‘lib_mysqludf_sys.so‘ from terminal using following command:

$ mysql -u root -p??? -h xxx

mysql> source ./lib_mysqludf_sys.sql

7) 測试

mysql> select sys_eval(‘id‘);
+----------------+
| sys_eval(‘id‘) |
+----------------+
|                       |
+----------------+
1 row in set (0.00 sec)
发现不起作用。这是因为apparmor控制引起的。AppArmor 是一个相似于selinux  的东西。基本的作用是设置某个可运行程序的訪问控制权限。能够限制程序 读/写某个文件夹/文件。打开/读/写网络port等。(參考:http://www.oschina.net/p/apparmor

运行以下的命令:

$ sudo ln -s /etc/apparmor.d/usr.sbin.mysqld /etc/apparmor.d/disable/
$ sudo apparmor_parser -R /etc/apparmor.d/usr.sbin.mysqld

再次測试:

mysql> mysql> select sys_eval(‘id‘);
+--------------------------------------------------+
| sys_eval(‘id‘)                                            |
+--------------------------------------------------+
| uid=114(mysql) gid=125(mysql) groups=125(mysql)   |
+--------------------------------------------------+
1 row in set (0.01 sec)
成功!

8)实战应用

创建文件夹:

$ sudo mkdir /usr/local/logserver/mysqludf
$ sudo vi /usr/local/logserver/mysqludf/test.sh

test.sh内容例如以下:

#!/bin/sh
#
# mysqludf-test.sh
#
#
# 2017-02-11
########################################################################
_file=$(readlink -f $0)
_cdir=$(dirname $_file)
_name=$(basename $_file)

echo "create date file:"

date > ${_cdir}/test.log

echo "${_cdir}/test.log"

exit 21

设置权限:

$ sudo chown mysql:mysql -R /usr/local/logserver/mysqludf

$ sudo chmod a+x /usr/local/logserver/mysqludf/test.sh

确保mysqludf及test.sh都是mysql:mysql

9)測试sys_eval:

mysql> select sys_eval(‘/usr/local/logserver/mysqludf/test.sh‘);
+-----------------------------------------------------------+
| sys_eval(‘/usr/local/logserver/mysqludf/test.sh‘)         |
+-----------------------------------------------------------+
| create date file:
/usr/local/logserver/mysqludf/test.log
 |
+-----------------------------------------------------------+
1 row in set (0.01 sec)

可见sys_eval把全部的echo输出显示出来。

10)測试sys_exec:

mysql> select sys_exec(‘/usr/local/logserver/mysqludf/test.sh‘);
+---------------------------------------------------+
| sys_exec(‘/usr/local/logserver/mysqludf/test.sh‘) |
+---------------------------------------------------+
|                                              5376 |
+---------------------------------------------------+
1 row in set (0.00 sec)

sys_exec运行test.sh之后的返回值是5376 (=256*exit 21)。因为test.sh 最后一句的:exit 21。

所以,在mysql过程里尽量使用sys_exec以获取脚本(test.sh)运行的返回值。

把test.sh改动成你的脚本,就能够使用mysqludf强大的功能了。

时间: 2024-10-30 14:04:47

MySQL 实现调用外部程序和系统命令的相关文章

MySql UDF 调用外部程序和系统命令

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目录下 #c

ECMall的MySQL数据调用的简单方法

很多ecmall开发者会问,怎么使用Ecmall的mysql类库进行数据调用.从原理上来讲Ecmall的数据调用是以数据模块+模块类库的方式进行mysql数据调用的,所有数据模块都存储在includesmodels 目录下,这些调用对于初学者来讲是比较复杂的,例如商品的数据调用函数,不能用在店铺的数据调用上,每个数据表都有自己的函数自己的类库和少量的公共类库.因此初学者来讲,调用mysql数据很困难. 现在讲解一个简单的调用方法能满足95%以上的mysql数据调用请求.足够对ecmall进行二次

oracle使用java source调用外部程序

oracle使用java source调用外部程序

Ecmall MySql 数据库调用教程

从原理上来讲Ecmall的数据调用是以数据模块+模块类库的方式进行mysql数据调用的,所有数据模块都存储在\includes\models 目录下,这些调用对于初学者来讲是比较复杂的,例如商品的数据调用函数,不能用在店铺的数据调用上,每个数据表都有自己的函数自己的类库和少量的公共类库.因此初学者来讲,调用mysql数据很困难. 我现在讲解一个简单的调用方法能满足95%以上的mysql数据调用请求.足够对ecmall进行二次开发. 例子存储在配资网站上. 例子: $db = &db(); 第一步

PowerShell中调用外部程序和进程操作命令例子

学习PowerShell,我们不指望通过C#编程去搞定所有事情,我们应该记住cmd.exe或者说批处理给我们留下的宝贵财富——通过调用外部程序去解决问题.调用了外部程序,势必就要对进程进行管理,这就是本文要介绍的. 1.Get-Process,返回进程. Get-Process [-id] ,按pid获取Get-Process -name ,按进程名Get-Process -inputObject ,传入参数 举例:get-process -name mmc,显示所有mmc的进程. 2.Star

WPF调用外部程序

想通过main()函数传递参数,先重载下面的OnStartup() public partial class App : Application { public static string args0; protected override void OnStartup(StartupEventArgs e) { if(e.Args != null && e.Args.Length > 0) args0 = e.Args[0].ToString(); base.OnStartup(

Windows API调用外部程序之图片查看

最近顺手接了一个小活,任务目标是将一组图像依次显示出来.环境就是XP中,代码嵌入到一个MFC工程里,图片是未经处理的可能是JPEG2000格式的j2c,也可能是bitmap.当然还可能没有任何的文件头,这个最后看实际情况再添加吧. 主要就是调用外部程序(j2c可以用网上的ivanview或kakadu,bmp就用Windows的图片查看工具),打开/关闭这两个功能.文件便利可以用CFileFind类,这里用的FindFirstFile和FindNextFile. 打开可以使用system(),还

C#使用Process类调用外部程序(转)

在程序开发中,一个程序经常需要去调用其他的程序,C#中Process类正好提供了这样的功能.它提供对本地和远程进程的访问并使您能够启动和停止本地系统进程. 一.启动进程实例 Process myProcess = new Process(); try { myProcess.StartInfo.UseShellExecute = false; myProcess.StartInfo.FileName = "test.exe"; myProcess.StartInfo.CreateNoW

start 调用外部程序

批处理中调用外部程序的命令(该外部程序在新窗口中运行,批处理程序继续往下执行,不理会外部程序的运行状况),如果直接运行外部程序则必须等外部程序完成后才继续执行剩下的指令 例:start explorer d:\调用图形界面打开D盘 start /w 则等待结束 命令格式是这样的: start "title" "path" "最大化最小化等其它参数" 如果你要运行的程序没有空格,不需要加引号的话就start abc 就行了.. 由于start命令后