从MySQL执行shell命令

时间:2008-11-14 12:17:08

标签: mysql database stored-procedures

我知道我正在寻找的可能是一个安全漏洞,但由于我设法在Oracle和SQL Server中完成,我会试一试:

我正在寻找一种从MySQL上的SQL脚本执行shell命令的方法。如有必要,可以创建和使用新的存储过程。

注意:我不是在寻找mysql命令行工具提供的SYSTEM命令。相反,我正在寻找这样的东西:

  

如果开始   COND1 ...       EXEC_OS cmd1;其他       EXEC_OS cmd2; END;

其中EXEC_OS是调用我的代码的方法。

4 个答案:

答案 0 :(得分:1)

答案 1 :(得分:1)

您可能需要考虑使用更具特色的脚本语言编写脚本,例如Perl,Python,PHP或Ruby。所有这些语言都有用于运行SQL查询的库。

存储过程语言中没有用于运行shell命令的内置方法。这被认为是一个坏主意,不仅因为它是一个安全漏洞,而且因为shell命令的任何影响都不遵守事务隔离或回滚,就像您在存储过程中执行的任何SQL操作的效果一样:

START TRANSACTION;
CALL MyProcedure();
ROLLBACK;

如果MyProcedure执行了创建或编辑文件,或发送电子邮件等操作,则这些操作不会回滚。

我建议您在存储过程中执行SQL工作,并在调用存储过程的应用程序中执行其他工作。

答案 2 :(得分:1)

这不是问题的答案,因为它是这种功能的理由 - 因此否定那些会说“你应该做别的事”或“你为什么要这样做”的人。

我有一个数据库,我试图遵守严格的规则 - 我不想在任何地方找孤儿。参考完整性检查可以帮助我在表级别上进行此操作,但是我必须将一些数据保存为文件系统中的文件(这是我老板直接命令不将任何二进制数据存储在数据库本身中的结果)。

这里显而易见的解决方案是在删除记录时触发一个触发器,然后自动删除相关的外部文件。

现在,我确实意识到UDF可能提供了一个解决方案,但这似乎很多C / C ++只能删除一个文件。当然,数据库权限本身至少会为潜在的攻击者提供某些安全性。

现在,我确实意识到我可以编写一个shell脚本或其他一些可以删除表记录然后去删除相关文件的脚本,但是再次,这是在数据库域本身之外。正如一位老教师曾经告诉我的那样,“业务规则应该反映在数据库的规则中”。可以清楚地看到,我无法使用MySQL强制执行此操作。

答案 3 :(得分:0)

根据forums.mysql.com上的this post,解决方案是使用MySQL_Proxy