標籤: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 實現調用外部程式和系統命令