代码之家  ›  专栏  ›  技术社区  ›  Moshe

从mysql执行shell命令

  •  3
  • Moshe  · 技术社区  · 17 年前

    我知道我要找的可能是一个安全漏洞,但由于我在Oracle和SQL Server中成功地做到了这一点,我将试一试:

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

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

    开始如果 COND1… 执行命令1;否则 执行命令2;结束;

    其中exec_os是调用代码的方法。

    4 回复  |  直到 13 年前
        1
  •  1
  •   Bill Karwin    17 年前

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

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

    START TRANSACTION;
    CALL MyProcedure();
    ROLLBACK;
    

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

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

        2
  •  1
  •   Nathan Crause    16 年前

    这并不是问题的答案,而是这种功能的正当理由——因此否定了那些会说“你应该做些别的”或“你为什么要做”的人。

    我有一个数据库,我正在努力保持严格的规则-我不希望孤儿在任何地方。引用完整性检查在表级别上有助于实现这一点,但我必须将一些数据作为文件保存在文件系统中(这是老板直接命令我不要在数据库本身存储任何二进制数据的结果)。

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

    现在,我意识到UDF可以提供一个解决方案,但是这看起来像是大量的C/C++工作来简单地删除一个文件。当然,数据库权限本身至少会提供 一些 来自潜在袭击者的安全。

    现在,我意识到我可以编写一个shell脚本,或者一些这样的脚本,它可以删除表记录,然后删除相关的文件,但同样,这不在数据库的领域内。 它本身 . 正如一位老教练曾经告诉我的,“业务规则应该反映在数据库的规则中”。正如人们所看到的,我不能使用mysql来强制实现这一点。

        3
  •  1
  •   pickypg    13 年前
        4
  •  0
  •   Eigir    17 年前

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