MySQL 8 UDF 執行外部程式和系統指令 for CentOS 8
在 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
本著作係採用創用 CC 姓名標示-相同方式分享 3.0 台灣 授權條款授權.