MySQL 實現調用外部程式和系統命令

來源:互聯網
上載者:User

標籤:port   span   get   uid   clu   內容   odi   root   follow   

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.logecho "${_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強大的功能了。


MySQL 實現調用外部程式和系統命令

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.