MySQL 8 UDF 執行外部程式和系統指令 for CentOS 8

MySQL

在 CentOS 8 的 MySQL 8 使用 UDF 來新增能夠使用 SQL 執行外部程式和系統指令的功能,並在不停用 SELinux 安全機制的狀態,允許 MySQL 能夠執行特定系統指令 (如 curl) 的設定。

UDF

UDF (用戶定義功能) 能夠讓用戶新增 MySQL 預設沒有提供的功能。

下載

開啟 GitHub - retanoj/mysql_udf: mysql udf eval/cmd 並複製【Download ZIP】連結網址 (本站存檔):

下載檔案 (貼上複製的連結網址):

wget https://github.com/retanoj/mysql_udf/archive/master.zip

解壓縮檔案:

unzip master.zip
Archive:  master.zip
7104a53e6d15e729e1e5132d291728ce1c63f985
   creating: mysql_udf-master/
  inflating: mysql_udf-master/Makefile
  inflating: mysql_udf-master/README.md
  inflating: mysql_udf-master/document.html
  inflating: mysql_udf-master/lib_mysqludf_sys.sql
  inflating: mysql_udf-master/udf_linux_src.c
  inflating: mysql_udf-master/udf_mysql5.6.23_win_x64_with_MFC.dll
  inflating: mysql_udf-master/udf_mysql5.6.25_redhat_x64.so
  inflating: mysql_udf-master/udf_mysql5.6.25_win_x64.dll
  inflating: mysql_udf-master/udf_mysql5.6.25_win_x86.dll
  inflating: mysql_udf-master/udf_vs2012_src.cpp

將 UDF 移至 MySQL plugin_dir 路徑並重新命名:

mv mysql_udf-master/udf_mysql5.6.25_redhat_x64.so /usr/lib64/mysql/plugin/lib_mysqludf_sys.so

設定檔案權限:

chmod 755 /usr/lib64/mysql/plugin/lib_mysqludf_sys.so

設定 SELinux:

chcon -u system_u -t lib_t /usr/lib64/mysql/plugin/lib_mysqludf_sys.so

安裝

依據說明文件安裝下述兩個功能。

sys_eval

sys_eval 可執行所有系統指令,並返回輸出。

執行以下 SQL 來安裝功能:

CREATE FUNCTION sys_eval RETURNS STRING SONAME 'lib_mysqludf_sys.so';
Query OK, 0 rows affected (0.66 sec)

sys_exec

sys_exec 可執行所有系統指令,並返回退出代碼。

執行以下 SQL 來安裝功能:

CREATE FUNCTION sys_exec RETURNS STRING SONAME 'lib_mysqludf_sys.so';
Query OK, 0 rows affected (0.68 sec)

說明文件

開啟 GitHub - mysqludf/lib_mysqludf_sys 並點擊【Download ZIP】下載檔案 (本站存檔):

解壓縮檔案並開啟說明文件 lib_mysqludf_sys.html:

UDF 的安裝、刪除、功能用途和使用方式都記錄在這份文件:

使用

sys_eval

在 SQL 使用安裝的 sys_eval 功能來執行系統指令並返回輸出:

SELECT sys_eval('ls -ald /etc');
+----------------------------------------------------+
| sys_eval('ls -ald /etc')                           |
+----------------------------------------------------+
| drwxr-xr-x. 84 root root 8192  2月 15 13:13 /etc   |
+----------------------------------------------------+
1 row in set (0.00 sec)

sys_exec

在 SQL 使用安裝的 sys_exec 功能來執行系統指令並返回退出代碼,這裡要執行 curl 指令來發送 HTTP Request。

MySQL 要執行某些系統指令必須設定 SELinux,否則會被抵擋,如要能順利執行 curl 指令則必須如下設定:

setsebool -P mysql_connect_any 1

使用 curl 發送一個 HTTP Request POST 到本機網站伺服器的 PHP 頁面:

SELECT sys_exec('curl -X POST --data "name=jacky&sex=f" http://localhost/sys_exec.php');
+----------------------------------------------------------------------------------+
| sys_exec('curl -X POST --data "name=jacky&sex=f" http://localhost/sys_exec.php') |
+----------------------------------------------------------------------------------+
| NULL                                                                             |
+----------------------------------------------------------------------------------+
1 row in set (0.02 sec)

其它

查看 MySQL 版本

使用 mysql 指令加上選項別名 -V 或全名 --version 來查看安裝的 MySQL 版本:

mysql -V
mysql --version

登入 MySQL 執行 SQL 查看:

SHOW VARIABLES LIKE 'version';
+---------------+--------+
| Variable_name | Value  |
+---------------+--------+
| version       | 8.0.17 |
+---------------+--------+
1 row in set (0.00 sec)

mysql> exit
Bye

查看 MySQL plugin_dir 路徑

SHOW VARIABLES LIKE '%dir';
+-----------------------------+----------------------------+
| Variable_name               | Value                      |
+-----------------------------+----------------------------+
| basedir                     | /usr/                      |
| character_sets_dir          | /usr/share/mysql/charsets/ |
| datadir                     | /var/lib/mysql/            |
| innodb_data_home_dir        |                            |
| innodb_log_group_home_dir   | ./                         |
| innodb_temp_tablespaces_dir | ./#innodb_temp/            |
| innodb_tmpdir               |                            |
| lc_messages_dir             | /usr/share/mysql/          |
| plugin_dir                  | /usr/lib64/mysql/plugin/   |
| slave_load_tmpdir           | /var/tmp                   |
| tmpdir                      | /var/tmp                   |
+-----------------------------+----------------------------+
11 rows in set (0.00 sec)

mysql> exit
Bye

發表留言