【问题标题】:Secure MySQL backup cron job – my.cnf is not being read安全 MySQL 备份 cron 作业 – my.cnf 未被读取
【发布时间】:2010-10-10 18:16:22
【问题描述】:

我尝试在运行 FreeBSD 的网络服务器上进行备份 cron 作业。目前它看起来像这样:

/usr/local/bin/mysqldump --opt --single-transaction --comments --dump-date --no-autocommit --all-databases --result-file=/var/backups/mysql/all.sql

当我以 root 身份运行它时它工作正常(因为 root 有一个 .my.cnf 以及用于连接的用户名和密码,但是当作业由 cron 运行时,my.cnf 文件不会被读取。

有什么办法可以绕过这个问题,而不必将用户名和密码输入命令本身(因为这有点不安全)?

奇怪的是,我对 PostgreSQL 和一个 .pgpass 文件有相同的设置,这就像一个魅力。

【问题讨论】:

    标签: mysql security cron freebsd


    【解决方案1】:

    我也遇到了。

    似乎 MySQL 被硬编码为查找“~/.my.cnf”,而不是“$HOME/.my.cnf”之类的东西。

    在 FreeBSD 上,从 /etc/crontab 调用的 cronjobs 将忽略波浪号“~”字符,因此会忽略 ~/.my.cnf 之类的值

    事实上,以下内容对我根本不起作用:

    mysql --defaults-extra-file=~/.my.cnf

    但是,使用 $HOME 变量确实有效:

    首页=/首页/管理员 mysql --defaults-extra-file=$HOME/.my.cnf

    作为替代方案,如果我将 cronjob 从 /etc/crontab 移动到 /var/cron/tabs/root(使用 'crontab -e' 作为 root),我的 cronjob 将起作用。

    【讨论】:

      【解决方案2】:

      在 FreeBSD 上,您可以添加以下内容:

      security.bsd.see_other_uids=0
      

      到 /etc/sysctl.conf 并重新启动,或使用

      sysctl security.bsd.see_other_uids=0
      

      设置 sysctl 值。

      现在除了 root 之外的用户只能查看自己的进程。所以将密码放在命令行中风险较小。

      另外,crontab 是怎么运行的?你是使用 crontab -e -u root 将它添加到 root 用户 crontab 中,还是添加到 /etc/crontab 中?

      验证是否在 .my.cnf 上设置了正确的权限以及 crontab 设置了哪些环境变量,因为这可能会导致它在与您的主目录不同的位置(对于 FreeBSD 上的 root 是 /root )。

      【讨论】:

        【解决方案3】:

        使用--defaults-extra-file 选项告诉它在哪里可以找到.my.cnf 文件(假设任何运行mysqldump 的用户都可以读取它。

        【讨论】:

        • 啊,是的。我怎么错过了。我会把它坚持到我的夜间工作中。期待在我睡觉时收到它的消息:)
        • 实际上,在 MySQL 在线文档中并不容易找到。没有一个单独的程序在其手册页中提到该选项。
        • mysql: unknown variable 'defaults-extra-file=~/.my.cnf
        • @Alnitak,显然,仅在最新版本中。它在我目前使用的任何版本的 MySQL 中都不可用...
        • @Cerin,我认为这可能是因为 mysql 客户端要求此选项是第一个参数,请尝试 mysql -help | grep 默认你会发现这个选项。实际上我遇到了同样的错误,并通过将该选项放在第一个参数中来修复它。
        【解决方案4】:

        这很奇怪,实际上 cron 应该读取 .my.cnf。如何在 /etc/crontab 或 crontab -e 中运行 cronjob?您可以尝试使用AutoMySQLBackup,这是一个使用 mysqldump 的小型 shell 脚本。

        【讨论】:

        • 嗯,实际上它不是直接从 cron 运行,而是由 FreeBSDs periodic 系统运行。它实际上是 /usr/local/etc/periodic/daily 中的一个脚本文件 定期 cron 作业通过 /etc/cron 运行,如下所示: > 1 3 * * * root periodic daily
        • 哦,cmets 中没有启用 Markdown。无论如何希望它是清晰的:)
        猜你喜欢
        • 2016-01-22
        • 2018-09-13
        • 1970-01-01
        • 2018-07-31
        • 2012-07-02
        • 2012-10-13
        • 2010-12-07
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多