通过shell脚本使用echo命令自动执行mysql_secure_installation

Kar*_*ikJ 56 mysql linux shell

我试图使用自动响应自动化mysql_secure_installation脚本.我的代码如下:

echo "& y y abc abc y y y y" | ./usr/bin/mysql_secure_installation
Run Code Online (Sandbox Code Playgroud)

我自动化的实际问题如下:

Enter current password for root (enter for none): <enter>
Set root password? [Y/n] y
New password: abc
Re-enter new password: abc
Remove anonymous users? [Y/n] y
Disallow root login remotely? [Y/n] y
Remove test database and access to it? [Y/n] y
Reload privilege tables now? [Y/n] y
Run Code Online (Sandbox Code Playgroud)

但它给了我一个错误"抱歉,你不能在这里使用空密码",但在屏幕上,我曾经按下第一个问题的返回键.

Sle*_*ely 73

我偶然发现了这个问题,但决定通过Bash脚本手动运行查询:

#!/bin/bash

# Make sure that NOBODY can access the server without a password
mysql -e "UPDATE mysql.user SET Password = PASSWORD('CHANGEME') WHERE User = 'root'"
# Kill the anonymous users
mysql -e "DROP USER ''@'localhost'"
# Because our hostname varies we'll use some Bash magic here.
mysql -e "DROP USER ''@'$(hostname)'"
# Kill off the demo database
mysql -e "DROP DATABASE test"
# Make our changes take effect
mysql -e "FLUSH PRIVILEGES"
# Any subsequent tries to run queries this way will get access denied because lack of usr/pwd param
Run Code Online (Sandbox Code Playgroud)

  • 禁止远程登录root DELETE FROM mysql.user WHERE User ='root'AND Host NOT IN('localhost','127.0.0.1',':: 1'); (9认同)
  • MariaDB 10.6 显示此错误 **查看“mysql.user”引用无效表** (4认同)

Jak*_*uld 46

由于mysql_secure_installation只是一个Bash脚本,只需查看原始源代码,如下所示.查找读取的行,do_query(注意我放置的额外空间do_query;需要查找与函数相关的查询)然后您可以找到这些命令.

UPDATE mysql.user SET Password=PASSWORD('root') WHERE User='root';
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;
DELETE FROM mysql.db WHERE Db='test' OR Db='test\\_%';
FLUSH PRIVILEGES;
Run Code Online (Sandbox Code Playgroud)

请注意,对于此示例,我设置了密码,root但可以随意更改密码以满足您的设置需求.无论如何,只需要一堆MySQL命令并将其保存在一个名为的文件中mysql_secure_installation.sql.

完成后,只需通过脚本运行以下命令来保护MySQL安装:

mysql -sfu root < "mysql_secure_installation.sql"
Run Code Online (Sandbox Code Playgroud)

s沉默的错误和f力量,如果一个扼流圈的命令仍能继续.在u涉及到紧挨其后其中,在本例-显然是用户名root.

在没有密码的情况下在最初安装MySQL的部署脚本中运行它,并且您都可以将其锁定而无需任何键盘交互.

PS:这个脚本被放在一起,以确保在Ubuntu 14.04上安装MySQL,该安装与export DEBIAN_FRONTEND=noninteractiveset和实际安装命令设置为sudo -E aptitude install -y --assume-yes -q mysql-server mysql-client.这样做会在没有密码的情况下在Ubuntu上干净地安装MySQL; 这对于部署脚本很有用.mysql -sfu root < "mysql_secure_installation.sql"在安装发生后,这只会在几秒钟内锁定它.

  • 仅供参考,在 mysql 8 中,团队用 C++ 重写了“mysql_secure_installation”。如果您仍然想使用从那里挑选命令的方法,则源代码在这里。更新密码的语法已更改:https://github.com/mysql/mysql-server/blob/7ed30a748964c009d4909cb8b4b22036ebdef239/client/mysql_secure_installation.cc (5认同)

Sla*_*lam 21

你可以尝试使用expect.看看这个自动化mysql_secure_installation或我的修改.

  • 请更新“例外”链接,该链接会导致:指定了两个或更多包错误(预计喘息) (2认同)

小智 18

我刚刚在CentOS 6.7上做了以下内容:

mysql_secure_installation <<EOF

y
secret
secret
y
y
y
y
EOF
Run Code Online (Sandbox Code Playgroud)

  • 方便,但不能维护,因为阅读它不能告诉你发生了什么. (6认同)
  • 在Ubuntu 16.04上不起作用,`mysql_secure_installation`一直要求输入root密码。 (2认同)
  • 当您可以执行脚本执行的精确查询时,为什么还要模拟 stdin?这个解决方案是不好的做法。脚本的读者不知道脚本的作用。 (2认同)

小智 6

这是基于@JakeGould's answer的全新 MySQL 5.7 安装的自动脚本。在 CentOS 7.5.1804 上运行良好。

yum localinstall -y https://dev.mysql.com/get/mysql57-community-release-el7-9.noarch.rpm
yum install -y mysql-community-server

# start mysql service
service mysqld start

# get Temporary root Password
root_temp_pass=$(grep 'A temporary password' /var/log/mysqld.log |tail -1 |awk '{split($0,a,": "); print a[2]}')

echo "root_temp_pass:"$root_temp_pass

# mysql_secure_installation.sql
cat > mysql_secure_installation.sql << EOF
# Make sure that NOBODY can access the server without a password
UPDATE mysql.user SET Password=PASSWORD('yourrootpass') WHERE User='root';
# Kill the anonymous users
DELETE FROM mysql.user WHERE User='';
# disallow remote login for root
DELETE FROM mysql.user WHERE User='root' AND Host NOT IN ('localhost', '127.0.0.1', '::1');
# Kill off the demo database
DROP DATABASE IF EXISTS test;
DELETE FROM mysql.db WHERE Db='test' OR Db='test\\_%';
# Make our changes take effect
FLUSH PRIVILEGES;
EOF

mysql -uroot -p"$root_temp_pass" --connect-expired-password <mysql_secure_installation.sql
Run Code Online (Sandbox Code Playgroud)


Pie*_*Rea 6

没有必要使用expect或从源代码中获取 SQL 命令(尽管如果您愿意,您要查找的 C++ 文件位于此处:https://github.com/mysql/mysql-server/blob/7ed30a748964c009d4909cb8b4b22036ebdef239 /client/mysql_secure_installation.cc

如果您对默认值感到满意mysql_secure_installation (最安全的选项始终是默认值),那么您可以使用该--use-default选项跳过大部分交互。mysql_secure_installation如果未设置,仍然会以交互方式询问您 root 密码,因此您可以通过在调用之前设置它来编写脚本mysql_secure_option

这是一个例子:

mysql -u root <<EOF
SET PASSWORD FOR root@localhost = '${ROOT_PASSWORD}';
FLUSH PRIVILEGES;
EOF

mysql_secure_installation -u root --password="${ROOT_PASSWORD}" --use-default
Run Code Online (Sandbox Code Playgroud)


Sta*_*lov 5

sudo mysql -e "SET PASSWORD FOR root@localhost = PASSWORD('123');FLUSH PRIVILEGES;" 

printf "123\n n\n n\n n\n y\n y\n y\n" | sudo mysql_secure_installation
Run Code Online (Sandbox Code Playgroud)

输入 root 的当前密码(输入无)?(我为 root 设置了 123 个)

切换到 unix_socket 身份验证?n

更改root密码?n

删除匿名用户?n

禁止远程root登录?是

删除测试数据库并访问它?是

现在重新加载权限表?是

版本:mysql Ver 15.1 Distrib 10.4.6-MariaDB,用于 osx10.14 (x86_64) 使用 readline 5.1