如果我使用 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
答案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 应该也可以执行此操作。请确保您在命令行上明确指定要使用的配置文件。