我正在编写一个脚本,希望启动该 mysql_secure_installation
脚本并在每个提示符下提供适当的答案。我尝试使用 echo,如下所示:
echo -e "\n\n$db_pass\n$db_pass\n\n\n\n\n" | /usr/bin/mysql_secure_installation
它不能完全工作。它似乎正确回答了最后 5 个问题,但不能正确回答前 3 个问题(这是在框上CentOS 6.5
)。以下是输出:
In order to log into MySQL to secure it, we'll need the current
password for the root user. If you've just installed MySQL, and
you haven't set the root password yet, the password will be blank,
so you should just press enter here.
stty: standard input: Invalid argument
Enter current password for root (enter for none):
stty: standard input: Invalid argument
OK, successfully used password, moving on...
Setting the root password ensures that nobody can log into the MySQL
root user without the proper authorisation.
Set root password? [Y/n] ... skipping.
当要求输入 root 密码时,它应该返回一个结果。然后,当要求设置 root 密码时,它应该返回另一个结果。但是,正如您从输出中看到的那样,并没有发生这种情况。
我需要做什么才能使其按预期工作?
答案1
这MySQL 开发网站上的错误报告mysql_secure_installation
解决了需要交互式用户会话的问题。
那里有一些很好的讨论,其中有一些利用的技巧和例子expect
作为一种解决方法。似乎可以满足您以非交互方式(即没有直接用户交互)运行脚本的愿望的最佳建议是 Daniël van Eeden 的回答,它提供了以下expect
脚本:
#!/usr/bin/expect --
spawn /usr/local/mysql/bin/mysql_secure_installation
expect "Enter current password for root (enter for none):"
send "\r"
expect "Set root password?"
send "y\r"
expect "New password:"
send "password\r"
expect "Re-enter new password:"
send "password\r"
expect "Remove anonymous users?"
send "y\r"
expect "Disallow root login remotely?"
send "y\r"
expect "Remove test database and access to it?"
send "y\r"
expect "Reload privilege tables now?"
send "y\r"
puts "Ended expect script."
此外,似乎主要问题是基础 MySQL 安装中存在不安全的内容似乎在 MySQL 5.6.8 中得到解决但仅适用于通过 RPM 进行的新安装或使用以下选项进行的源代码安装--random-password
:
新的 RPM 安装操作(不是升级)调用mysql_install_db 使用 --random-passwords 选项。因此,从此版本开始的 RPM 安装将保护其 root 帐户,并且不会有匿名用户帐户。(使用 Unbreakable Linux Network 的 RPM 安装操作不受影响,因为它们不使用 mysql_install_db。
对于使用二进制 .tar.gz 分发版或源分发版的安装操作,您可以调用mysql_install_db使用 --random-passwords 选项手动使您的 MySQL 安装更安全。建议这样做,特别是对于包含敏感数据的站点。
答案2
你不能这样做。如果你想与脚本交互,你必须使用类似期望(1)- 在 SF 和更广泛的互联网上有一些关于如何做到这一点的例子。
你可以模仿大部分mysql_secure_安装和
/usr/bin/mysql -uroot -e "DELETE FROM mysql.user WHERE User=\'\'; DELETE FROM mysql.user WHERE User=\'root\' AND Host NOT IN (\'localhost\', \'127.0.0.1\', \'::1\'); DROP DATABASE IF EXISTS test; FLUSH PRIVILEGES;"
之后您需要做的就是设置一个 root 密码。