在 cron 任务中使用 mysqldump 无需 root 密码

在 cron 任务中使用 mysqldump 无需 root 密码

如果我使用 root 密码登录,我只需输入

mysqldump --all-databases 我将得到预期的“Dump”。

我在 cron.daily 中设置了一个作业来运行并将其转储到备份驱动器。我遇到的问题是,尽管用户以 root 身份运行,但我收到以下消息

mysqldump:出现错误:1045:拒绝用户“root”@“localhost”访问(使用密码:否)

尝试连接时。我不要想要在脚本中硬编码mysql数据库root密码(谁会这么做)。

考虑到我可以在 bash shell 的命令行中输入“mysqldump”,必须有某种方法可以绕过使用 -u 参数。我在脚本顶部已经有 #!/bin/bash。

我在这里遗漏了什么才能让它不要求输入数据库的根密码?

答案1

为了连接到 mysql 服务器,您必须提供凭据。您可以在配置文件中指定它们,通过命令行传递它们,或者简单地创建不需要凭据的帐户。

当然,永远不要使用无密码选项,传递命令行并不好,因为任何可以运行 ps 的人都可以看到命令行。

建议的选项是创建一个mysql 配置文件使用其中的凭据,然后使用文件系统权限保护该文件,以便只有备份用户可以访问它。

您在以 root 身份交互登录时能够登录 mysql 服务器,这似乎表明您没有设置 root 密码,或者您的脚本找不到您的配置文件。如果您有 .my.cnf,则可能需要手动指向它。如果您的 root 帐户没有设置密码,那么我强烈建议您修复该问题。

更新(2016-06-29)如果你正在运行 mysql 5.6.6 或更高版本,你应该看看mysql_config_editor允许您的工具存储凭证在加密文件中。感谢乔瓦尼向我提及此事。

答案2

安全不应该通过隐蔽来实现。如果您担心有人可以访问您的 root 帐户,那么 root 的 mysql 密码是否存储在脚本中并不重要,因为您的所有数据都保存在 mysql 转储或数据库文件中。因此,真正的问题是您要保护什么?

如果你不想让其他人获得允许他们更改数据库中数据的密码,则需要创建一个用户适当的权限

如果你不想让除 root 之外的任何本地帐户看到该 mysql 密码,请设置文件权限在该脚本上为 0700 并且所有者为 root。

答案3

您可以使用 shell 来执行此操作,因为您有一个 shell 可以从中运行它,即当您登录时,您配置文件中的所有 shell 脚本都会运行。

Cron 没有这样的奢侈。当它登录时(以 root 身份),它将使用默认 shell 登录。这可以防止任何人远程登录,但这也意味着没有运行自动登录脚本。

您可以为 cron 设置一个 shell 来运行,编辑 crontab 并添加 SHELL 和 HOME 变量,例如。

SHELL=/bin/bash
HOME=/root

如果未设置这些,则 cron 将使用 /etc/passwd 中指定的 shell 和主目录运行(可能什么都没有,可能是 /bin/sh)。

如果您想要查看 cron 运行的环境,请添加一个将环境导出到文件的 cron 作业,例如:

$crontab -e
* * * * * env > /tmp/crontabenv.log
:wq

答案4

Cron 的调试非常令人沮丧。当 cron 作业执行时,它们没有像 shell 那样设置环境。

cron 的提示:

  • 对所有内容使用完整路径——“ECHO=/bin/echo”等:(在顶部定义变量以使其更容易)
  • 设置 MAILTO,这样你就可以从每个作业中收到一封电子邮件(或者让作业将 stderr/stdout 重定向到一个文件)

如果您的 root 用户可以执行此操作,则 cron 应该也可以执行此操作。请确保您在命令行上明确指定要使用的配置文件。

相关内容