在没有root密码的cron作业中使用mysqldump


14

如果我使用我的盒子上的root密码登录,则只需键入

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

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

mysqldump:得到错误:1045:用户'root'@'localhost'的访问被拒绝(使用密码:NO)

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

考虑到我可以在bash shell的命令行中键入“ mysqldump”,所以必须使用-u参数来解决。我在脚本顶部已经有#!/ bin / bash了。

我在这里想得到什么来不要求输入数据库的根密码吗?

Answers:


12

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

当然,永远不要使用no-password选项,因为命令行用户不是很好,因为可以运行ps的任何人都可以看到命令行。

推荐的选项是创建一个带有证书的mysql配置文件,然后使用文件系统权限保护该文件,以便只有您的备份用户才能访问它。

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

更新(2016-06-29)如果运行的是mysql 5.6.6或更高版本,则应查看mysql_config_editor工具,该工具可将凭据存储在加密文件中。感谢乔瓦尼向我提及这一点。


1
该方法仍需要使用纯文本格式的未加密密码才能在系统上使用。那就是我要避免的事情。
Mech Software 2010年

>您没有设置root密码,或者您的脚本没有找到配置文件。作者明确指出,root用户有一个mysql密码,并且他试图访问数据库而不将其提供给mysqldump命令:“(使用密码:否)”。因此访问被拒绝错误。
神话2010年

1
作者@monomyth还指出,以root身份交互式登录时,无需密码即可登录。这告诉我有些不对劲。
Zoredache

2
@Mech Software,试图保护自己免受root帐户的攻击没有多大意义。如果某人拥有root帐户,则只需重启mysql并完全绕过权限系统即可。
Zoredache

1
我能够登录的原因是root帐户指定了具有600权限的.my.cnf,因此这就是Shell获得访问权限的方式。但是cron必须忽略该文件,因此我在这篇文章中使用了参数来指向它。
Mech Software 2010年

3

不应通过默默无闻来实现安全性。如果您担心有人可以访问您的root帐户,则脚本中是否存储了root的mysql密码也没关系,因为您的所有数据都可以在mysql转储或数据库文件中使用。因此,真正的问题是您要保护什么?

如果您不希望其他人获得可以让他们更改数据库中数据的密码,则需要创建一个具有适当权限的用户。

如果您不希望任何本地帐户看到该mysql密码,则该脚本的root设置文件权限为0700,所有者为root。


1
我想我仍然不明白的是,如果我可以在没有密码输入的情况下(从根提示符下)键入mysqldump,为什么不能以相同的方式在cron作业中运行它。需要-p参数缺少的部分。我并不是想“模糊”密码,我只是不想输入密码。根登录本身的特定之处在于允许访问,那么为什么不能用cron复制它呢?
Mech Software 2010年

如果看到可以使用相同的“ root”用户使用密码登录而不使用密码,则说明您的mysql数据库中可能有多个root用户。其中一些可能未设置密码。您可以从“ root” @“ localhost”中删除密码,但不仅cron将能够连接到您的数据库,而且任何拥有本地帐户的人都可以连接到您的数据库。这与在明文脚本中输入密码没有什么不同(或更糟)。
monomyth 2010年

我认为关键是MechSoftware所做的事情是,以root用户身份本质上可以使您对数据库文件进行读取访问,并且它们未加密。因此,只要求root用户提供root MySQL口令才能漂亮地打印他们实际上已经可以访问的数据,这就是“通过模糊性实现安全性”。此外,权限是很容易陷入困境,例如,如果有人递归设置他们的目录,如果有一个符号链接文件等
Septagram

2

您可以使用Shell,因为您有可以运行的Shell,即登录时,配置文件中的所有Shell脚本都可以运行。

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

您可以为cron设置要在其下运行的外壳,编辑crontab并添加SHELL和HOME变量,例如。

SHELL=/bin/bash
HOME=/root

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

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

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

1

如果脚本是由超级用户运行的,则可以创建一个文件/root/.my.cnf,其权限为600,内容如下:

[client]
user = DBUSERNAME
password = DBPASSWORD

(当然,您可以在其中输入MySQL用户名和密码)。

如果以root身份运行,则任何mysql命令行工具都会自动读取该文件。不再需要在命令行上提供它。600权限可防止窥视。


1
我发现这是没有密码的情况下如何使用mysqldump的情况。因此,这解决了SHELL运作方式的神秘性,那么cron为什么不阅读它?
Mech Software 2010年

1
从cron运行时,mysqldump可能无法找到.my.cnf文件。补救措施是添加一个mysqldump参数以显式读取.my.cnf文件中的选项,即--defaults-extra-file = / root / .my.cnf我从堆栈溢出的其他两个答案中学到了这一点。请参阅stackoverflow.com/a/602054/854680stackoverflow.com/a/890554/854680
MikeOnline 2015年

1

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

cron提示:

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

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


0

尽管这些响应中的一些是有用的,但由于Unix根用户和mysql根用户并不相同,并且除了它们都使用登录名“ root”以外,它们基本上没有任何关系,因此令人困惑。也许这很明显,但似乎有些回应将两者混为一谈。

mysqld的一个有用选项(也许存在)是允许以unix root身份运行的客户端程序(例如mysql或mysqldump等)在没有密码的情况下访问mysqld的root @ localhost,而不必存储root @ localhost的(mysql)密码在my.cnf文件或类似文件中。

我知道这让您感到有些紧张,但原因是任何以本地(对于mysqld服务器)unix根目录运行的人都可以轻松地绕过mysqld的安全性。并拥有一个带有mysqld根密码7x24的my.cnf,甚至在运行中(例如,执行mysqldump)动态创建/删除一个带有mysqld根密码(该密码来自何处?)的my.cnf都使感到紧张。

这将需要一些基础结构和思考,因为必须信任mysql / mysqldump / etc才能将其确实认为是由本地unix根帐户运行的消息传输到mysqld。

但是,例如,仅将其限制为mysqld的unix套接字(无TCP)可能会有所帮助,至少强烈建议使用此选项。那可能会确定客户端在本地运行,这可能还不够。但这可能是一个想法的开始。也许通过unix套接字发送文件描述符可能是另一段(如果听起来像疯话,那就用谷歌搜索)。

PS不,我不会在这里尝试集思广益,这些想法如何在非unix操作系统上运行,如果这个想法可能会转化为其他操作系统。


1
/root/.my.cnf适当的权限放入凭据可以很好地解决此问题。
迈克尔·汉普顿

我不同意,现在任何可以访问该文件(包括通过其他系统漏洞进行访问)的人都具有mysql root pw。而且这里有24x7的系统需要受到攻击,并且位于固定的文件位置(因此,不必放在/ root目录中。)但是,例如,无论谁运行文件系统转储,或者可以访问其中一个,都可以将其拉出文件系统转储文件。在那种情况下,这听起来像是对不满的员工的一种诱惑。我认为这是一个合理的目标,在任何地方的系统上都不存在明文密码。
巴里·谢恩

也许是这样,但是您提出的建议要糟糕得多,因为它允许任何本地用户轻易地假装为root。
迈克尔·汉普顿

不,我的建议是,它们必须已经是本地服务器上的unix根,在这种情况下,本地mysqld信任以unix root身份运行的mysql或mysqldump等(客户端),并允许它们像已通过mysql root身份验证一样继续进行。正如我说的,如果它们已经是服务器本地的Unix root用户,则可以通过一些有据可查的命令来绕过mysql root密码(“ mysql root密码恢复”)。
巴里·谢因
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.