【问题标题】:MySQL UDF sys_exec() doesn't workMySQL UDF sys_exec() 不起作用
【发布时间】:2015-02-19 15:30:06
【问题描述】:

我有一个触发器,它使用调用SET result = sys_exec(cmd); 的参数调用存储过程。但它给出了错误“函数 sys_exec 不存在”。

我不知道该怎么做,周二我有演示文稿,由于这个代码行,我的项目将无法运行。 我尝试工作的代码。

DELIMITER $$
CREATE PROCEDURE push_message
(p1   int,
 p2   int,
 p3 varchar(20))
BEGIN
 DECLARE cmd CHAR(255);
 DECLARE result CHAR(255);
 SET cmd = CONCAT('curl https://pubsub.pubnub.com/publish/demo/demo/0/mysql_triggers/0/%22',p1, ',' ,p2, ',' ,p3,'%22');
 SET result = sys_exec(cmd);
END$$; 


CREATE TRIGGER push_message_trigger AFTER INSERT ON your_table_name_here
FOR EACH ROW
CALL push_message(NEW.id, NEW.num, NEW.name);

【问题讨论】:

  • 如果你想执行 proc 试试 execute 或 exec 看看它要说什么。
  • 你创建函数了吗,运行文件lib_mysqludf_sys.sql

标签: mysql stored-procedures user-defined-functions


【解决方案1】:

试试:

mysql> SELECT VERSION();
+-----------------+
| VERSION()       |
+-----------------+
| 5.5.35-1ubuntu1 |
+-----------------+
1 row in set (0.00 sec)

mysql> SHOW VARIABLES LIKE 'plugin_dir';
+---------------+------------------------+
| Variable_name | Value                  |
+---------------+------------------------+
| plugin_dir    | /usr/lib/mysql/plugin/ | -- copy 'lib_mysqludf_sys.so' here
+---------------+------------------------+
1 row in set (0.01 sec)

mysql> DROP FUNCTION IF EXISTS lib_mysqludf_sys_info;
Query OK, 0 rows affected, 1 warning (0.00 sec)

mysql> DROP FUNCTION IF EXISTS sys_get;
Query OK, 0 rows affected, 1 warning (0.00 sec)

mysql> DROP FUNCTION IF EXISTS sys_set;
Query OK, 0 rows affected, 1 warning (0.00 sec)

mysql> DROP FUNCTION IF EXISTS sys_exec;
Query OK, 0 rows affected, 1 warning (0.00 sec)

mysql> DROP FUNCTION IF EXISTS sys_eval;
Query OK, 0 rows affected, 1 warning (0.00 sec)

mysql> CREATE FUNCTION lib_mysqludf_sys_info RETURNS string SONAME 'lib_mysqludf_sys.so';
Query OK, 0 rows affected (0.00 sec)

mysql> CREATE FUNCTION sys_get RETURNS string SONAME 'lib_mysqludf_sys.so';
Query OK, 0 rows affected (0.00 sec)

mysql> CREATE FUNCTION sys_set RETURNS int SONAME 'lib_mysqludf_sys.so';
Query OK, 0 rows affected (0.00 sec)

mysql> CREATE FUNCTION sys_exec RETURNS int SONAME 'lib_mysqludf_sys.so';
Query OK, 0 rows affected (0.00 sec)

mysql> CREATE FUNCTION sys_eval RETURNS string SONAME 'lib_mysqludf_sys.so';
Query OK, 0 rows affected (0.00 sec)

mysql> SELECT sys_exec('curl http://stackoverflow.com/');
+--------------------------------------------+
| sys_exec('curl http://stackoverflow.com/') |
+--------------------------------------------+
|                                          0 |
+--------------------------------------------+
1 row in set (0.12 sec)

更多详情,请访问:24.3.2.5 Compiling and Installing User-Defined Functions

【讨论】:

    【解决方案2】:

    尝试一次。

    要遵循的步骤:

    • https://github.com/mysqludf/lib_mysqludf_sys获取文件

    • 转到终端中的文件夹路径。

    • 执行:

      gcc -DMYSQL_DYNAMIC_PLUGIN -fPIC -Wall -m64 -I/usr/include/mysql -I. -shared lib_mysqludf_sys.c -o lib_mysqludf_sys.so
      

      注意:如果 32 位操作系统在上述命令中将 -m64 替换为 -m32

    • 在 mysql shell 中执行以下命令:

      SHOW VARIABLES LIKE 'plugin_dir';
      

      这是一个成功输出的例子:

      +---------------+------------------------+
      | Variable_name | Value                  |
      +---------------+------------------------+
      | plugin_dir    | /usr/lib/mysql/plugin/ |
      +---------------+------------------------+
      
    • lib_mysqludf_sys.so文件复制到上述路径。

    • 在mysql shell中执行以下操作

      CREATE FUNCTION sys_exec RETURNS INT SONAME 'lib_mysqludf_sys.so';
      

    【讨论】:

      【解决方案3】:

      sys_exec 不是 MySql 内置函数,您应该使用用户定义函数 (UDF)。参考这里https://dev.mysql.com/doc/refman/8.0/en/create-function-udf.html#:~:text=A%20user%2Ddefined%20function%20is,ABS()%20or%20CONCAT()%20.&text=function_name%20is%20the%20name%20that,of%20the%20function's%20return%20value

      如果您的操作系统是 Windows,请使用这个(Linux 有 .so 文件,Windows 有 .dll 文件) https://github.com/rapid7/metasploit-framework/tree/master/data/exploits/mysql

      下载文件并复制到您的 ../MySQL/lib 或 ../MySQL/lib/plugin 目录。

      打开 MySQL,复制并执行:

      DROP FUNCTION IF EXISTS lib_mysqludf_sys_info;
      DROP FUNCTION IF EXISTS sys_get;
      DROP FUNCTION IF EXISTS sys_set;
      DROP FUNCTION IF EXISTS sys_exec;
      DROP FUNCTION IF EXISTS sys_eval;
      
      CREATE FUNCTION lib_mysqludf_sys_info RETURNS string SONAME 'lib_mysqludf_sys_64.dll';
      CREATE FUNCTION sys_get RETURNS string SONAME 'lib_mysqludf_sys_64.dll';
      CREATE FUNCTION sys_set RETURNS int SONAME 'lib_mysqludf_sys_64.dll';
      CREATE FUNCTION sys_exec RETURNS int SONAME 'lib_mysqludf_sys_64.dll';
      CREATE FUNCTION sys_eval RETURNS string SONAME 'lib_mysqludf_sys_64.dll';
      

      然后你就可以调用一个.exe文件了:

      DECLARE cmd CHAR(255);
      DECLARE result int(10);
      SET cmd = "../<ProjectApp>/bin/Debug/netcoreapp3.1/<appName>.exe";
      SET result = sys_exec(cmd);
      

      【讨论】:

        猜你喜欢
        • 2012-09-09
        • 2019-12-15
        • 2012-10-03
        • 1970-01-01
        • 1970-01-01
        • 2023-03-26
        • 1970-01-01
        • 1970-01-01
        • 2016-08-07
        相关资源
        最近更新 更多