【问题标题】:Automate mysql_secure_installation with echo command via a shell script通过 shell 脚本使用 echo 命令自动化 mysql_secure_installation
【发布时间】:2014-08-07 20:59:06
【问题描述】:

我正在尝试通过自动响应来自动化 mysql_secure_installation 脚本。我的代码如下:

echo "& y y abc abc y y y y" | ./usr/bin/mysql_secure_installation

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

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

但它给了我一个错误“对不起,您不能在此处使用空密码”,但在屏幕上我曾经在第一个问题时按返回键。

【问题讨论】:

  • 解决该问题的方法是我手动运行将在 mysql_secure_install 期间触发的所有查询。它现在有效。谢谢。

标签: mysql linux shell


【解决方案1】:

我偶然发现了这个问题,但决定通过 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

【讨论】:

  • 禁止 root 远程登录 DELETE FROM mysql.user WHERE User='root' AND Host NOT IN ('localhost', '127.0.0.1', '::1');
  • 对于 mariadb mysql -e "ALTER USER 'root'@'localhost' IDENTIFIED BY 'password'; FLUSH PRIVILEGES;"
  • 如果测试数据库不存在,它将以0 返回状态退出,因此如果您使用set -e,则不会终止您的脚本:mysql -e "DROP DATABASE IF EXISTS test"
  • MariaDB 10.6 显示此错误 查看“mysql.user”引用无效表
【解决方案2】:

由于 mysql_secure_installation 只是一个 Bash 脚本,请查看 raw source code as shown here。查找读取为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;

请注意,在本例中,我将密码设置为 root,但您可以随意更改以符合您的设置需求。不管怎样,把那一堆简单的 MySQL 命令保存在一个名为 mysql_secure_installation.sql 的文件中。

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

mysql -sfu root < "mysql_secure_installation.sql"

s 会消除错误,f 会强制命令继续执行,即使有人窒息。 u 与紧随其后的用户名相关,在这种情况下,显然是 root

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

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

【讨论】:

  • 仅供参考,在 mysql 8 中,团队用 C++ 重写了 mysql_secure_installation。源代码在这里,如果您仍然想使用从那里挑选命令的方法。更新密码的语法已更改:github.com/mysql/mysql-server/blob/…
【解决方案3】:

我刚刚在 CentOS 6.7 上使用以下内容进行了此操作:

mysql_secure_installation <<EOF

y
secret
secret
y
y
y
y
EOF

【讨论】:

  • 优秀的答案。这种技术很棒——它也适用于 fdisk。干净易读。
  • 方便肯定,但不可维护,因为阅读它并不能告诉你发生了什么。
  • Centos 6 的答案不错,但可惜它在 7 上对我不起作用。
  • 在 Ubuntu 16.04 上不起作用,mysql_secure_installation 一直要求输入 root 密码。
  • 为我在 centos7 上工作。谢谢
【解决方案4】:

您可以尝试使用自动化交互式应用程序的expect。 看看这个automating mysql_secure_installation 或我的modification

【讨论】:

  • 请更新“except”链接,链接导致:Error two or more packages specified (expect wheezy)
【解决方案5】:

这是一个基于@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

【讨论】:

    【解决方案6】:
    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
    

    输入当前 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

    【讨论】:

      【解决方案7】:

      不必使用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
      

      【讨论】:

        【解决方案8】:

        你可以试试这个:

        echo -e "\ny\ny\nabc\nabc\ny\ny\ny\ny" | ./usr/bin/mysql_secure_installation
        

        【讨论】:

        • 去掉“.” (点)在“./usr/bin/mysql_secure_installation”中,它应该可以工作。
        • 在 Ubuntu 16.04 上不起作用,mysql_secure_installation 一直要求输入 root 密码。
        • 如果这段时间不适合您,请将 ./usr/bin/mysql_secure_installation 替换为 sh /usr/bin/mysql_secure_installation
        【解决方案9】:

        刚刚在 Ubuntu Bionic 18.04LTS 上测试过这个

        步骤#1

        export MYPWD="D33Ps3CR3T";
        export NEWPWD="D33P3Rs3CR3T";
        

        步骤 #2

        # First time **ever**
        sudo mysql_secure_installation 2>/dev/null <<MSI
        
        n
        y
        ${MYPWD}
        ${MYPWD}
        y
        y
        y
        y
        
        MSI
        
        # Did it work?
        mysql -u root -p${MYPWD} -e "SELECT 1+1";
        # -------
        

        步骤#3

        # Every subsequent time
        sudo mysql_secure_installation 2>/dev/null <<MSI2
        ${MYPWD}
        n
        y
        ${NEWPWD}
        ${NEWPWD}
        y
        y
        y
        y
        
        MSI2
        
        # Just in case (optional) ....
        sudo service mysql restart
        
        # Did it work?
        mysql -u root -p${NEWPWD} -e "SELECT 1+1";
        
        

        在从步骤 #1 编辑前后密码后,您应该能够将步骤 #2 和 #3 直接剪切粘贴到终端中。

        注意事项

        • 如果已经设置了 root 密码,第 2 步将失败,请转到第 3 步
        • 这只是一个输入命令的heredoc
        • sudo 是必填项。
        • MSI 没有特别的含义(它是避免碰撞;我在脚本的其他地方使用 EOF)
        • MYPWD == NEWPWD 是允许的
        • 2&gt;/dev/null 隐藏警告“stty: 'standard input': Inappropriate ioctl for device”
        • 您可以将&amp;&gt;/dev/null 用于完全静音模式。

        【讨论】:

          【解决方案10】:

          适用于 AWS。亚马逊 Linux 2 AMI。 启动实例的自定义设置(AWS 用户数据):

                  #!/bin/bash            
                  sudo yum -y update &> /dev/null
                  wget https://repo.mysql.com/mysql80-community-release-el7-1.noarch.rpm &> /dev/null
                  sudo yum -y localinstall mysql80-community-release-el7-1.noarch.rpm
                  sudo yum -y install mysql-community-server &> /dev/null
                  sudo service mysqld start
                     
                  # get Temporary root Password
                  root_temp_pass=$(sudo 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
                  sudo cat > mysql_secure_installation.sql << EOF
                  # Make sure that NOBODY can access the server without a password
                  ALTER USER 'root'@'localhost' IDENTIFIED BY 'yourrootpass';
                  # 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
                  
          sudo mysql -uroot -p"$root_temp_pass" --connect-expired-password <mysql_secure_installation.sql
          sudo systemctl enable mysql
          

          【讨论】:

            【解决方案11】:

            MySql安装后我使用简单的命令更改root密码,但得到上述error (signal 9 kill)

            (FATAL: Chef::Exceptions::ChildConvergeError: Chef run process terminated by signal 9 (KILL)) Though the command works and password is changed the error is confusing.
            script "change password" do
            interpreter "bash"
            user "root"
            cwd "/tmp"
            code <<-EOH
            #MYSQL
            root_temp_pass=$(grep 'A temporary password' /mysql/log/mysqld.log |tail -1 |awk '{split($0,a,": "); print a[2]}')
            
            #Login as root change password
            mysql -uroot -p"$root_temp_pass" -Be "ALTER USER 'root'@'localhost' IDENTIFIED BY 'Czt732ck#';" --connect-expired-password
            EOH
            end
            

            【讨论】:

              【解决方案12】:

              我使用以下几行。适用于 AWS Linux AMI 2018

              db_root_password=Password4root
              cat <<EOF | mysql_secure_installation
              y
              0
              $db_root_password
              $db_root_password
              y
              y
              y
              y
              y
              EOF
              

              【讨论】:

                【解决方案13】:
                1. 在 Windows 操作系统中,只需搜索通常位于 Drive:\MySQL_Install-DIR\bin\ 中的“mysql_secure_installation”应用程序
                2. 按 WindowKey + R 只需运行命令 'Drive:\MySQL_Install-DIR\bin\mysql_secure_installation'

                当您运行此命令时,将弹出一个窗口,引导您完成保护 MySQL 安装的过程。就是这样!

                【讨论】:

                • 这不是 OP 要求的。
                猜你喜欢
                • 2017-08-12
                • 1970-01-01
                • 2015-12-15
                • 2019-03-22
                • 1970-01-01
                • 2015-11-01
                • 2011-12-23
                • 2023-04-08
                • 1970-01-01
                相关资源
                最近更新 更多