如果我在我的盒子上用root密码login,我可以简单地input
mysqldump –all-databases,我会得到期望的“转储”。
我在cron.daily中设置了一个工作来运行并将其转储到备份驱动器。 我有的问题是,虽然用户正在以root身份运行,我得到以下消息
mysqldump:有错误:1045:访问被拒绝用户'root'@'localhost'(使用密码:否)
当试图连接。 我不想在脚本中硬编码MySQL数据库的根密码(谁会)。
考虑到我可以在我的bash shell的命令行中input“mysqldump”,必须有一些方法来解决使用-u参数的问题。我已经在脚本的顶部有#!/ bin / bash了。
我在这里错过什么来获得这个不要求数据库的根密码?
为了连接到MySQL服务器,你必须提供凭据。 您可以在configuration文件中指定它们,通过命令行传递它们,或者直接创build不需要凭据的帐户。
当然,不应该使用无密码选项,传递命令行不是很好,因为任何可以运行ps的人都可以看到命令行。
build议的选项是创build一个带有凭据的mysqlconfiguration文件 ,然后用文件系统权限保护该文件,这样只有备份用户才能访问它。
您可以以root用户身份交互login时login到mysql服务器,似乎表明您没有设置root密码,或者您的脚本没有findconfiguration文件。 如果您有.my.cnf,您可能需要手动指向它。 如果您的root帐户没有设置密码,那么我强烈build议您解决这个问题。
更新(2016-06-29)如果您正在运行MySQL 5.6.6或更高版本,您应该查看mysql_config_editor工具,该工具允许您将凭据存储在encryption文件中。 感谢乔瓦尼提到这个给我。
安全不应该通过默默无闻的方式来完成。 如果您担心有人可以访问您的root帐户,那么根目录的mysql密码是否存储在脚本中并不重要,因为您可以在mysql转储或数据库文件中使用所有数据。 所以,真正的问题是你想保护什么?
如果您不希望其他人获得允许他们更改数据库中的数据的密码,则需要创build具有适当权限的用户。
如果您不想让任何本地帐户看到该密码,除了该脚本上的根设置文件权限为0700且所有者为root。
你的shell使用可以做到这一点,因为你有一个shell来运行它,也就是说,当你login时,你的configuration文件中的所有shell脚本都可以运行。
克朗没有这样的奢侈品。 当它以root身份login时,它将使用默认的shelllogin。 这可以防止任何人远程login,但这也意味着没有运行的自动login脚本。
您可以设置一个shell来运行cron,编辑crontab并添加SHELL和HOMEvariables,例如。
SHELL=/bin/bash HOME=/root
如果这些没有设置,那么cron将运行在/ etc / passwd中指定的shell和home目录(可能是什么,可能是/ bin / sh)。
如果你想看到cron运行的环境,添加一个将env导出到文件的cron作业,例如:
$crontab -e * * * * * env > /tmp/crontabenv.log :wq
如果脚本以root 身份运行,则可以创build一个具有权限600和以下内容的文件/root/.my.cnf :
[client] user = DBUSERNAME password = DBPASSWORD
(当然你input你的MySQL用户名和密码)。
如果以root用户身份运行,则该文件将被任何mysql命令行工具自动读取。 不再需要在命令行上提供它。 600个权限保护它免受窥探。
Cron可能会非常沮丧地进行debugging。 当cron作业执行时,他们没有像你认为的shell一样设置环境。
cron的提示:
如果你的root用户可以从shell执行它,那么cron应该可以做到这一点。 确保你明确地指定了在命令行中使用的configuration文件。
尽pipe这些响应中有几个是有帮助的,但有几个是令人困惑的,因为unix root用户和mysql root用户并不相同,除了他们都使用login名“root”之外基本上没有任何关系。 也许这是显而易见的,但似乎有些反应混淆了两者。
有什么可能是一个有用的select(也许它存在?)到mysqld将允许客户端程序,如MySQL或mysqldump等作为Unix根运行无需存储root @ localhost的(MySQL)密码访问mysqld的root @ localhost没有密码在my.cnf文件或类似的。
我知道这让一些紧张,但推理是任何人作为本地(到mysqld服务器)运行unix根可以通过mysqld的安全无论如何,很容易。 然后用mysqld root密码7×24创build一个my.cnf,甚至用mysql root密码(这个密码从哪里来)创build/删除一个my.cnf(例如,创build一个mysqldump),这让我感到紧张。
这将需要一些基础设施和思考,因为必须信任mysql / mysqldump / etc传输给mysqld,它确信它是由本地unix root帐户运行的。
但是,例如,仅限于mysqld的unix套接字,没有TCP,可以帮助,至less作为这个选项的强烈推荐选项。 这可以确定客户在本地运行,这可能不够。 但这可能是一个想法的开始。 也许发送一个文件描述符通过unix套接字可能是另一块(谷歌它,如果这听起来像疯了话)。
PS不,我不打算在这里集思广益,如何可能在non-unix操作系统上工作,这个想法可能转化为其他操作系统。