MySQL 8 自动安装脚本(CentOS-7 系统)

文章目录

  • [一、MySQL 8 自动安装脚本脚本说明](#一、MySQL 8 自动安装脚本脚本说明)
    • [📌 使用脚本前提条件](#📌 使用脚本前提条件)
      • [1. 操作系统](#1. 操作系统)
      • [2. 用户权限](#2. 用户权限)
      • [3. 网络要求](#3. 网络要求)
    • [📌 脚本的主要功能](#📌 脚本的主要功能)
      • [1. 环境检查](#1. 环境检查)
      • [2. MySQL 自动安装](#2. MySQL 自动安装)
      • [3. 自动配置 MySQL](#3. 自动配置 MySQL)
      • [4. 防火墙配置](#4. 防火墙配置)
      • [5. 验证与输出](#5. 验证与输出)
    • [📌 适用场景](#📌 适用场景)
  • 二、执行sh脚本
    • [1. 给予脚本执行权限](#1. 给予脚本执行权限)
    • [2. 脚本内容](#2. 脚本内容)
  • 三、脚本执行结果
    • [1. 登录 mysql 测试](#1. 登录 mysql 测试)
    • [2. 远程 mysql 测试](#2. 远程 mysql 测试)

一、MySQL 8 自动安装脚本脚本说明

这个脚本是一个用于在 CentOS 7 系统上安装和配置 MySQL 的自动化脚本

备注:该脚本只适用于 CentOS-7 系统 ,确保 CentOS-7系统 是联网状态,否则脚本执行时会出现下载错误的情况

脚本执行完之后,root 用户密码是 123456 ,同时会新建一个任意主机登录且拥有所有权限的 test 用户,密码同样是 123456 (用于测试练习环境,密码可自行修改)。


📌 使用脚本前提条件

1. 操作系统

仅支持 CentOS 7 (其他版本如 CentOS 8、RHEL、Ubuntu 等不兼容)

必须是纯净的 CentOS 7 或新装系统(避免软件冲突)

2. 用户权限

必须使用 root 用户执行 (或具有 sudo -i 权限的用户)

❌ 普通用户无权限安装 MySQL 和修改系统配置

3. 网络要求

服务器必须能访问互联网(自动下载 MySQL Yum 仓库和依赖包)


📌 脚本的主要功能

1. 环境检查

  • 检查是否为 root 用户(必须 root 权限运行)
  • 检查操作系统是否为 CentOS 7(仅支持 CentOS 7)
  • 检查 MySQL 是否已安装(避免重复安装)

2. MySQL 自动安装

  • 配置 MySQL Yum 仓库(自动下载官方 repo)
  • 导入 GPG 密钥(确保软件包来源可信)
  • 安装 MySQL 服务器(默认安装最新稳定版)
  • 启动 MySQL 服务(并设置开机自启)

3. 自动配置 MySQL

  • 获取临时密码(MySQL 8.0+ 默认生成临时密码)
  • 修改 root 密码为 123456(简化测试环境登录)
  • 调整密码策略(临时降低复杂度要求,便于测试)
  • 创建测试用户 test (密码 123456,开放远程访问权限)

4. 防火墙配置

  • 开放 3306 端口(允许远程连接 MySQL)

5. 验证与输出

  • 检查 MySQL 是否正常运行
  • 显示 MySQL 版本信息
  • 汇总所有操作记录(成功/跳过的步骤)
  • 输出连接信息(root/test 用户及密码)

📌 适用场景

测试环境快速搭建 (开发、学习、实验)

自动化部署 MySQL (避免手动安装的繁琐步骤)

批量配置 MySQL 服务器 (适用于多台 CentOS 7 服务器)

MySQL 学习者的练习环境(默认密码简化操作)


二、执行sh脚本

建议先使用 vi/vim 编辑命令创建并编辑一个名为 install_mysql.sh 的脚本文件(名字可以自定义,写 1.sh 都可以),然后把下面的脚本内容复制粘贴过去即可

  • 在 Linux 系统中,要让一个 shell 脚本可以执行,就需要给它添加执行权限。chmod +x
  • 命令能为文件添加可执行权限之后再给脚本执行权限。脚本文件后缀
  • 虽然 Linux 系统本身并不依靠文件后缀来识别文件类型,但使用 .sh 作为 shell脚本的后缀,能增强脚本的可读性与可维护性,同时也有助于系统识别脚本类型。

备注: 如果在Windows上面拖文件进去的话,有可能会出现编码格式问题导致运行脚本出现其他错误问题,只是有这个可能。


1. 给予脚本执行权限

这里是把脚本内容,在 vimINSERT (插入)模式下复制粘贴到新建的 文件名.sh 里面,然后保存退出,使用chmod +x 文件名.sh 给予执行权限,最后再使用 ./文件名.sh 执行脚本。

bash 复制代码
vim install_mysql.sh			# 编辑 .sh 文件(文件名可自定义)
chmod +x install_mysql.sh		# 给予 .sh 文件可执行文件(不授权无法执行.sh文件)
./install_mysql.sh				# ./ 执行 .sh 文件

2. 脚本内容

这里复制粘贴过去 vim 编辑的文件里面 (最好是在vim的插入模式下粘贴过去)

bash 复制代码
#!/bin/bash

# 定义颜色代码
RED='\033[0;31m'       # 错误信息
GREEN='\033[0;32m'     # 成功信息
YELLOW='\033[0;33m'    # 警告/提示信息
BLUE='\033[0;34m'      # 步骤信息
PURPLE='\033[0;35m'    # 强调信息
CYAN='\033[0;36m'      # 执行命令/详细信息
NC='\033[0m'           # 恢复默认颜色

# 初始化操作记录数组
declare -a operations_done
declare -a operations_skipped

# 显示脚本标题
echo -e "${PURPLE}"
echo "╔══════════════════════════════════════════════════╗"
echo "║      MySQL一键安装配置脚本(CentOS 7测试环境)     ║"
echo "╚══════════════════════════════════════════════════╝"
echo -e "${NC}"

# 记录脚本开始时间
start_time=$(date +%s)

# 1. 检查运行环境
echo -e "${BLUE}▶ 1. 正在检查运行环境...${NC}"

# 检查是否为root用户
echo -e "${CYAN}[执行] id -u${NC}"
if [ "$(id -u)" -ne 0 ]; then
    echo -e "${RED}✖ 错误:此脚本必须以root用户身份运行!${NC}"
    echo -e "${YELLOW}请使用命令:sudo -i 切换到root用户后再执行本脚本${NC}"
    exit 1
else
    operations_done+=("检查root用户权限")
    echo -e "${GREEN}✓ 当前用户是root${NC}"
fi

# 检查系统是否为CentOS 7
echo -e "${CYAN}[执行] grep -q \"CentOS Linux release 7\" /etc/centos-release${NC}"
if ! grep -q "CentOS Linux release 7" /etc/centos-release 2>/dev/null; then
    echo -e "${RED}✖ 错误:此脚本仅适用于CentOS 7系统!${NC}"
    echo -e "${YELLOW}检测到您的系统不是CentOS 7,请更换系统后再试${NC}"
    exit 1
else
    operations_done+=("检查系统版本为CentOS 7")
    echo -e "${GREEN}✓ 系统版本检查通过${NC}"
fi

echo -e "${GREEN}✓ 环境检查全部通过${NC}"

# 2. 检查MySQL是否已安装
echo -e "${BLUE}▶ 2. 正在检查MySQL安装状态...${NC}"
echo -e "${CYAN}[执行] rpm -qa | grep -q mysql-community-server${NC}"

if rpm -qa | grep -q mysql-community-server; then
    operations_done+=("检测到MySQL已安装")
    echo -e "${YELLOW}⚠ 检测到MySQL已安装,将检查root密码...${NC}"

    # 先检查密码是否为123456
    echo -e "${CYAN}[执行] mysql -uroot -p'123456' -e \"SELECT 1\"${NC}"
    if mysql -uroot -p'123456' -e "SELECT 1" >/dev/null 2>&1; then
        operations_skipped+=("修改root密码(已经是123456)")
        echo -e "${GREEN}✓ 检测到MySQL root密码已经是123456,无需修改${NC}"
    else
        echo -e "${YELLOW}⚠ root密码不是123456,将尝试自动修改root密码...${NC}"

        # 保存原密码策略
        echo -e "${CYAN}[执行] 获取当前密码策略...${NC}"
        old_policy=$(mysql -uroot -p'123456' -N -e "SHOW GLOBAL VARIABLES LIKE 'validate_password.policy';" 2>/dev/null | awk '{print $2}')
        [ -z "$old_policy" ] && old_policy="HIGH"
        old_length=$(mysql -uroot -p'123456' -N -e "SHOW GLOBAL VARIABLES LIKE 'validate_password.length';" 2>/dev/null | awk '{print $2}')
        [ -z "$old_length" ] && old_length="8"
        old_mixed_case_count=$(mysql -uroot -p'123456' -N -e "SHOW GLOBAL VARIABLES LIKE 'validate_password.mixed_case_count';" 2>/dev/null | awk '{print $2}')
        [ -z "$old_mixed_case_count" ] && old_mixed_case_count="1"
        old_number_count=$(mysql -uroot -p'123456' -N -e "SHOW GLOBAL VARIABLES LIKE 'validate_password.number_count';" 2>/dev/null | awk '{print $2}')
        [ -z "$old_number_count" ] && old_number_count="1"
        old_special_char_count=$(mysql -uroot -p'123456' -N -e "SHOW GLOBAL VARIABLES LIKE 'validate_password.special_char_count';" 2>/dev/null | awk '{print $2}')
        [ -z "$old_special_char_count" ] && old_special_char_count="1"

        # 增强的密码修改函数
        function modify_existing_mysql() {
            echo -e "${CYAN}[执行] grep 'temporary password' /var/log/mysqld.log${NC}"
            local temp_password=$(grep 'temporary password' /var/log/mysqld.log 2>/dev/null | awk '{print $NF}')
            local methods=(
                "临时密码:${temp_password}"
                "空密码"
                "已知密码:123456"
            )

            for method in "${methods[@]}"; do
                IFS=':' read -r method_type method_pass <<< "$method"
                echo -e "${CYAN}尝试方法: ${method_type}...${NC}"
                local mysql_cmd="mysql -uroot"
                [ -n "$method_pass" ] && mysql_cmd+=" -p'${method_pass}'"
                echo -e "${CYAN}[执行] ${mysql_cmd} --connect-expired-password <修改密码SQL${NC}"
                ${mysql_cmd} --connect-expired-password <<EOF 2>/dev/null
ALTER USER 'root'@'localhost' IDENTIFIED BY 'TempPass@123';
SET GLOBAL validate_password.policy=LOW;
SET GLOBAL validate_password.length=6;
SET GLOBAL validate_password.mixed_case_count=0;
SET GLOBAL validate_password.number_count=0;
SET GLOBAL validate_password.special_char_count=0;
ALTER USER 'root'@'localhost' IDENTIFIED BY '123456';
FLUSH PRIVILEGES;
EOF
                if [ $? -eq 0 ]; then
                    operations_done+=("使用${method_type}修改root密码")
                    return 0
                fi
            done

            # 如果常规方法都失败,尝试强制修改
            echo -e "${RED}✖ 所有常规方法失败,尝试强制修改密码...${NC}"
            echo -e "${CYAN}[执行] systemctl stop mysqld${NC}"
            systemctl stop mysqld || return 1
            echo -e "${CYAN}[执行] mysqld_safe --skip-grant-tables --skip-networking &${NC}"
            mysqld_safe --skip-grant-tables --skip-networking &
            sleep 5
            echo -e "${CYAN}[执行] mysql -uroot <强制修改密码SQL${NC}"
            mysql -uroot <<EOF
UPDATE mysql.user SET authentication_string=PASSWORD('123456') WHERE User='root';
FLUSH PRIVILEGES;
EOF
            echo -e "${CYAN}[执行] pkill mysqld${NC}"
            pkill mysqld
            sleep 2
            echo -e "${CYAN}[执行] systemctl start mysqld${NC}"
            systemctl start mysqld
            if mysql -uroot -p'123456' -e "SELECT 1" >/dev/null 2>&1; then
                operations_done+=("强制修改root密码")
                return 0
            else
                return 1
            fi
        }

        if modify_existing_mysql; then
            # 恢复原密码策略
            echo -e "${CYAN}[执行] 恢复原密码策略...${NC}"
            mysql -uroot -p'123456' -e "SET GLOBAL validate_password.policy='$old_policy'; SET GLOBAL validate_password.length='$old_length'; SET GLOBAL validate_password.mixed_case_count='$old_mixed_case_count'; SET GLOBAL validate_password.number_count='$old_number_count'; SET GLOBAL validate_password.special_char_count='$old_special_char_count'; FLUSH PRIVILEGES;" >/dev/null 2>&1 && \
            operations_done+=("恢复原密码策略")
        else
            echo -e "${RED}✖ 自动修改密码失败!${NC}"
            echo -e "${YELLOW}请尝试以下手动解决方案:${NC}"
            echo -e "1. 停止MySQL服务: ${CYAN}systemctl stop mysqld${NC}"
            echo -e "2. 启动安全模式: ${CYAN}mysqld_safe --skip-grant-tables &${NC}"
            echo -e "3. 无密码登录: ${CYAN}mysql -uroot${NC}"
            echo -e "4. 执行SQL: ${CYAN}UPDATE mysql.user SET authentication_string=PASSWORD('123456') WHERE User='root';${NC}"
            echo -e "5. 刷新权限: ${CYAN}FLUSH PRIVILEGES;${NC}"
            echo -e "6. 退出并重启MySQL服务"
            exit 1
        fi
    fi

    # 检查并创建test用户
    echo -e "${CYAN}[执行] mysql -uroot -p'123456' -N -e \"SELECT 1 FROM mysql.user WHERE user = 'test' AND host = '%';\"${NC}"
    if [ -z "$(mysql -uroot -p'123456' -N -e "SELECT 1 FROM mysql.user WHERE user = 'test' AND host = '%';" 2>/dev/null)" ]; then
        echo -e "${CYAN}[执行] 创建test用户...${NC}"
        mysql -uroot -p'123456' -e "CREATE USER 'test'@'%' IDENTIFIED BY '123456'; GRANT ALL PRIVILEGES ON *.* TO 'test'@'%' WITH GRANT OPTION; FLUSH PRIVILEGES;" >/dev/null 2>&1 && \
        operations_done+=("创建test用户(密码123456,所有权限)")
    else
        operations_skipped+=("创建test用户(已存在)")
        echo -e "${YELLOW}⚠ test用户已存在,跳过创建${NC}"
    fi

    # 计算并显示脚本执行时间
    end_time=$(date +%s)
    duration=$((end_time - start_time))
    
    # 显示操作汇总
    echo -e "\n${BLUE}════════════════════ 操作汇总 ════════════════════${NC}"
    echo -e "${GREEN}✓ 已完成的操作:${NC}"
    printf "  • %s\n" "${operations_done[@]}"
    
    if [ ${#operations_skipped[@]} -gt 0 ]; then
        echo -e "${YELLOW}⚠ 已跳过的操作:${NC}"
        printf "  • %s\n" "${operations_skipped[@]}"
    fi
    
    echo -e "\n${BLUE}▶ 脚本执行完成,总耗时: ${PURPLE}${duration}秒${NC}"
    
    # 显示最终用户信息
    echo -e "\n${PURPLE}════════════════════ 连接信息 ════════════════════${NC}"
    echo -e "| ${CYAN}MySQL root用户: ${PURPLE}root${NC} 密码: ${PURPLE}123456${NC}"
    echo -e "| ${CYAN}MySQL test用户: ${PURPLE}test${NC} 密码: ${PURPLE}123456 (可从任意主机连接)${NC}"
    echo -e "${PURPLE}══════════════════════════════════════════════════${NC}"
    exit 0
fi

# 以下是新安装MySQL的流程 --------------------------------------------------

operations_done+=("检测到MySQL未安装,开始全新安装流程")
echo -e "${GREEN}✓ 检测到MySQL未安装,将开始全新安装流程${NC}"

# 3. 配置MySQL Yum仓库
echo -e "${BLUE}▶ 3. 正在配置MySQL Yum仓库...${NC}"

if ! rpm -qa | grep -q mysql80-community-release-el7; then
    echo -e "${CYAN}[执行] 下载MySQL Yum仓库...${NC}"
    echo -e "${CYAN}[执行] wget -O /tmp/mysql80-community-release-el7-7.noarch.rpm https://dev.mysql.com/get/mysql80-community-release-el7-7.noarch.rpm${NC}"
    if wget -O /tmp/mysql80-community-release-el7-7.noarch.rpm https://dev.mysql.com/get/mysql80-community-release-el7-7.noarch.rpm; then
        echo -e "${CYAN}[执行] yum localinstall -y /tmp/mysql80-community-release-el7-7.noarch.rpm${NC}"
        if yum localinstall -y /tmp/mysql80-community-release-el7-7.noarch.rpm; then
            rm -f /tmp/mysql80-community-release-el7-7.noarch.rpm
            operations_done+=("安装MySQL Yum仓库")
            echo -e "${GREEN}✓ MySQL Yum仓库安装成功${NC}"
        else
            echo -e "${RED}✖ 安装MySQL Yum仓库失败!${NC}"
            exit 1
        fi
    else
        echo -e "${RED}✖ 下载MySQL Yum仓库失败!${NC}"
        exit 1
    fi
else
    operations_skipped+=("安装MySQL Yum仓库(已存在)")
    echo -e "${YELLOW}⚠ MySQL Yum仓库已安装,跳过此步骤${NC}"
fi

# 4. 导入GPG密钥
echo -e "${BLUE}▶ 4. 正在导入GPG密钥...${NC}"

echo -e "${CYAN}[执行] rpm --import https://repo.mysql.com/RPM-GPG-KEY-mysql-2022${NC}"
if rpm --import https://repo.mysql.com/RPM-GPG-KEY-mysql-2022 || rpm --import https://repo.mysql.com/RPM-GPG-KEY-mysql; then
    operations_done+=("导入MySQL GPG密钥")
    echo -e "${GREEN}✓ GPG密钥导入成功${NC}"
else
    operations_skipped+=("导入MySQL GPG密钥")
    echo -e "${YELLOW}⚠ 导入MySQL GPG密钥失败,将使用--nogpgcheck继续${NC}"
fi

# 5. 安装MySQL服务器
echo -e "${BLUE}▶ 5. 正在安装MySQL服务器...${NC}"

echo -e "${CYAN}[执行] yum install -y mysql-community-server --nogpgcheck${NC}"
if yum install -y mysql-community-server --nogpgcheck; then
    operations_done+=("安装MySQL服务器")
    echo -e "${GREEN}✓ MySQL服务器安装成功${NC}"
else
    echo -e "${RED}✖ MySQL服务器安装失败!尝试清理后重新安装...${NC}"
    echo -e "${CYAN}[执行] yum remove -y mysql-community-common mysql-community-libs${NC}"
    yum remove -y mysql-community-common mysql-community-libs
    echo -e "${CYAN}[执行] rm -rf /var/lib/mysql /etc/my.cnf*${NC}"
    rm -rf /var/lib/mysql /etc/my.cnf*
    echo -e "${CYAN}[执行] yum install -y mysql-community-server --nogpgcheck${NC}"
    if yum install -y mysql-community-server --nogpgcheck; then
        operations_done+=("安装MySQL服务器(经过清理后)")
        echo -e "${GREEN}✓ MySQL服务器安装成功(经过清理后)${NC}"
    else
        echo -e "${RED}✖ MySQL服务器安装仍然失败!${NC}"
        exit 1
    fi
fi

# 6. 启动MySQL服务
echo -e "${BLUE}▶ 6. 正在启动MySQL服务...${NC}"

echo -e "${CYAN}[执行] systemctl start mysqld${NC}"
if systemctl start mysqld; then
    operations_done+=("启动MySQL服务")
    echo -e "${CYAN}[执行] systemctl enable mysqld${NC}"
    systemctl enable mysqld && operations_done+=("设置MySQL开机自启")
    echo -e "${GREEN}✓ MySQL服务启动成功${NC}"
else
    echo -e "${RED}✖ 启动MySQL服务失败!尝试修复...${NC}"
    echo -e "${CYAN}[执行] chown -R mysql:mysql /var/lib/mysql${NC}"
    chown -R mysql:mysql /var/lib/mysql
    echo -e "${CYAN}[执行] systemctl start mysqld${NC}"
    if systemctl start mysqld; then
        operations_done+=("启动MySQL服务(经过修复后)")
        echo -e "${CYAN}[执行] systemctl enable mysqld${NC}"
        systemctl enable mysqld && operations_done+=("设置MySQL开机自启")
        echo -e "${GREEN}✓ MySQL服务启动成功(经过修复后)${NC}"
    else
        echo -e "${RED}✖ 仍然无法启动MySQL服务!${NC}"
        exit 1
    fi
fi

# 7. 获取临时密码
echo -e "${BLUE}▶ 7. 正在获取临时密码...${NC}"

echo -e "${CYAN}[执行] grep 'temporary password' /var/log/mysqld.log${NC}"
temp_password=$(grep 'temporary password' /var/log/mysqld.log | awk '{print $NF}')
if [ -z "$temp_password" ]; then
    echo -e "${CYAN}[执行] 检查是否已有密码123456...${NC}"
    echo -e "${CYAN}[执行] mysql -uroot -p'123456' -e \"SELECT 1\"${NC}"
    if mysql -uroot -p'123456' -e "SELECT 1" >/dev/null 2>&1; then
        temp_password="123456"
        operations_skipped+=("获取临时密码(已有密码123456)")
        echo -e "${YELLOW}⚠ 检测到已有密码123456,使用此密码${NC}"
    else
        echo -e "${CYAN}[执行] 检查是否可以空密码登录...${NC}"
        echo -e "${CYAN}[执行] mysql -uroot -e \"SELECT 1\"${NC}"
        if mysql -uroot -e "SELECT 1" >/dev/null 2>&1; then
            temp_password=""
            operations_skipped+=("获取临时密码(可以空密码登录)")
            echo -e "${YELLOW}⚠ 可以空密码登录MySQL${NC}"
        else
            echo -e "${RED}✖ 无法确定MySQL root密码!${NC}"
            exit 1
        fi
    fi
else
    operations_done+=("获取临时密码")
    echo -e "${GREEN}✓ 获取到临时密码: ${temp_password}${NC}"
fi

# 8. 修改root密码
echo -e "${BLUE}▶ 8. 正在修改root密码...${NC}"

# 保存原密码策略
echo -e "${CYAN}[执行] 获取当前密码策略...${NC}"
old_policy=$(mysql -uroot -p"$temp_password" -N -e "SHOW GLOBAL VARIABLES LIKE 'validate_password.policy';" 2>/dev/null | awk '{print $2}')
[ -z "$old_policy" ] && old_policy="HIGH"
old_length=$(mysql -uroot -p"$temp_password" -N -e "SHOW GLOBAL VARIABLES LIKE 'validate_password.length';" 2>/dev/null | awk '{print $2}')
[ -z "$old_length" ] && old_length="8"
old_mixed_case_count=$(mysql -uroot -p"$temp_password" -N -e "SHOW GLOBAL VARIABLES LIKE 'validate_password.mixed_case_count';" 2>/dev/null | awk '{print $2}')
[ -z "$old_mixed_case_count" ] && old_mixed_case_count="1"
old_number_count=$(mysql -uroot -p"$temp_password" -N -e "SHOW GLOBAL VARIABLES LIKE 'validate_password.number_count';" 2>/dev/null | awk '{print $2}')
[ -z "$old_number_count" ] && old_number_count="1"
old_special_char_count=$(mysql -uroot -p"$temp_password" -N -e "SHOW GLOBAL VARIABLES LIKE 'validate_password.special_char_count';" 2>/dev/null | awk '{print $2}')
[ -z "$old_special_char_count" ] && old_special_char_count="1"

function set_mysql_password() {
    local temp_pass="$1"
    local new_pass="123456"
    local mysql_cmd="mysql -uroot"
    [ -n "$temp_pass" ] && mysql_cmd+=" -p'${temp_pass}'"
    
    echo -e "${CYAN}[执行] ${mysql_cmd} --connect-expired-password <修改密码SQL${NC}"
    mysql -uroot -p"$temp_pass" --connect-expired-password <<EOF 2>/dev/null
ALTER USER 'root'@'localhost' IDENTIFIED BY 'TempPass@123';
SET GLOBAL validate_password.policy=LOW;
SET GLOBAL validate_password.length=6;
SET GLOBAL validate_password.mixed_case_count=0;
SET GLOBAL validate_password.number_count=0;
SET GLOBAL validate_password.special_char_count=0;
ALTER USER 'root'@'localhost' IDENTIFIED BY '${new_pass}';
FLUSH PRIVILEGES;
EOF
    return $?
}

if set_mysql_password "$temp_password"; then
    operations_done+=("修改root密码为123456")
    echo -e "${GREEN}✓ root密码修改成功${NC}"
else
    echo -e "${RED}✖ 常规密码修改失败!尝试强制修改...${NC}"
    echo -e "${CYAN}[执行] systemctl stop mysqld${NC}"
    systemctl stop mysqld
    echo -e "${CYAN}[执行] mysqld_safe --skip-grant-tables --skip-networking &${NC}"
    mysqld_safe --skip-grant-tables --skip-networking &
    sleep 5
    echo -e "${CYAN}[执行] mysql -uroot <强制修改密码SQL${NC}"
    mysql -uroot <<EOF
UPDATE mysql.user SET authentication_string=PASSWORD('123456') WHERE User='root';
FLUSH PRIVILEGES;
EOF
    echo -e "${CYAN}[执行] pkill mysqld${NC}"
    pkill mysqld
    sleep 2
    echo -e "${CYAN}[执行] systemctl start mysqld${NC}"
    systemctl start mysqld
    if mysql -uroot -p'123456' -e "SELECT 1" >/dev/null 2>&1; then
        operations_done+=("强制修改root密码为123456")
        echo -e "${GREEN}✓ 强制修改root密码成功${NC}"
    else
        echo -e "${RED}✖ 强制修改密码失败!${NC}"
        exit 1
    fi
fi

# 恢复原密码策略
echo -e "${CYAN}[执行] 恢复原密码策略...${NC}"
mysql -uroot -p'123456' -e "SET GLOBAL validate_password.policy='$old_policy'; SET GLOBAL validate_password.length='$old_length'; SET GLOBAL validate_password.mixed_case_count='$old_mixed_case_count'; SET GLOBAL validate_password.number_count='$old_number_count'; SET GLOBAL validate_password.special_char_count='$old_special_char_count'; FLUSH PRIVILEGES;" >/dev/null 2>&1 && \
operations_done+=("恢复原密码策略")
echo -e "${GREEN}✓ 密码策略恢复成功${NC}"

# 9. 配置防火墙
echo -e "${BLUE}▶ 9. 正在配置防火墙...${NC}"

echo -e "${CYAN}[执行] systemctl is-active --quiet firewalld${NC}"
if systemctl is-active --quiet firewalld; then
    echo -e "${CYAN}[执行] firewall-cmd --permanent --add-port=3306/tcp${NC}"
    if firewall-cmd --permanent --add-port=3306/tcp && firewall-cmd --reload; then
        echo -e "${CYAN}[执行] firewall-cmd --list-ports | grep -q 3306${NC}"
        if firewall-cmd --list-ports | grep -q 3306; then
            operations_done+=("防火墙已放行3306端口")
            echo -e "${GREEN}✓ 防火墙3306端口配置成功${NC}"
        else
            operations_skipped+=("防火墙配置可能未生效,请手动检查")
            echo -e "${YELLOW}⚠ 防火墙配置可能未生效,请手动检查${NC}"
        fi
    else
        operations_skipped+=("防火墙配置失败")
        echo -e "${YELLOW}⚠ 防火墙配置失败${NC}"
    fi
else
    operations_skipped+=("防火墙未运行,跳过端口配置")
    echo -e "${YELLOW}⚠ 防火墙未运行,跳过端口配置${NC}"
fi

# 10. 验证安装
echo -e "${BLUE}▶ 10. 正在验证安装结果...${NC}"

echo -e "${CYAN}[执行] mysql -uroot -p'123456' -e \"SHOW DATABASES;\"${NC}"
if mysql -uroot -p'123456' -e "SHOW DATABASES;" >/dev/null 2>&1; then
    operations_done+=("验证MySQL安装成功")
    echo -e "${CYAN}[执行] mysql -uroot -p'123456' -e \"SELECT VERSION();\"${NC}"
    mysql_version=$(mysql -uroot -p'123456' -e "SELECT VERSION();" 2>/dev/null | tail -n 1)
    operations_done+=("MySQL版本: ${mysql_version}")
    echo -e "${GREEN}✓ MySQL安装验证成功,版本: ${mysql_version}${NC}"
else
    echo -e "${RED}✖ 测试连接失败!${NC}"
    exit 1
fi

# 检查并创建test用户
echo -e "${CYAN}[执行] mysql -uroot -p'123456' -N -e \"SELECT 1 FROM mysql.user WHERE user = 'test' AND host = '%';\"${NC}"
if [ -z "$(mysql -uroot -p'123456' -N -e "SELECT 1 FROM mysql.user WHERE user = 'test' AND host = '%';" 2>/dev/null)" ]; then
    echo -e "${CYAN}[执行] 创建test用户...${NC}"
    mysql -uroot -p'123456' -e "CREATE USER 'test'@'%' IDENTIFIED BY '123456'; GRANT ALL PRIVILEGES ON *.* TO 'test'@'%' WITH GRANT OPTION; FLUSH PRIVILEGES;" >/dev/null 2>&1 && \
    operations_done+=("创建test用户(密码123456,所有权限)")
    echo -e "${GREEN}✓ test用户创建成功${NC}"
else
    operations_skipped+=("创建test用户(已存在)")
    echo -e "${YELLOW}⚠ test用户已存在,跳过创建${NC}"
fi

# 11. 安全加固建议
operations_skipped+=("安全加固建议(测试环境可忽略)")
echo -e "${YELLOW}⚠ 测试环境跳过安全加固建议${NC}"

# 计算并显示脚本执行时间
end_time=$(date +%s)
duration=$((end_time - start_time))

# 显示操作汇总
echo -e "\n${BLUE}════════════════════ 操作汇总 ════════════════════${NC}"
echo -e "${GREEN}✓ 已完成的操作:${NC}"
printf "  • %s\n" "${operations_done[@]}"

if [ ${#operations_skipped[@]} -gt 0 ]; then
    echo -e "${YELLOW}⚠ 已跳过的操作:${NC}"
    printf "  • %s\n" "${operations_skipped[@]}"
fi

echo -e "\n${BLUE}▶ 脚本执行完成,总耗时: ${PURPLE}${duration}秒${NC}"

# 显示最终用户信息
echo -e "\n${PURPLE}════════════════════ 连接信息 ════════════════════${NC}"
echo -e "| ${CYAN}MySQL root用户: ${PURPLE}root${NC} 密码: ${PURPLE}123456${NC}"
echo -e "| ${CYAN}MySQL test用户: ${PURPLE}test${NC} 密码: ${PURPLE}123456 (可从任意主机连接)${NC}"
echo -e "${PURPLE}══════════════════════════════════════════════════${NC}"

三、脚本执行结果

脚本执行结束的结果如下,脚本执行之后,便可直接使用 test 用户远程MySQL服务, test 是拥有所有权限的远程用户

脚本执行结束信息输出如下:


1. 登录 mysql 测试

这里拿脚本最后给出的连接信息登录MySQL数据库,可以看到都可以符合脚本最后的输出的用户密码信息登录。


2. 远程 mysql 测试

这里就不用 Navicat 软件测试远程,顺手使用其他的虚拟机来测试,这里拿 Kali-Linux 的系统测试MySQL远程连接,不管是用虚拟机远程还是Navicat这些远程数据库工具,远程测试结果都一样的。 首先就是要和 mysql 服务端通信,可以看到 192.168.101.124 客户端和 192.168.101.123 服务端通信,说明可以建立连接。

bash 复制代码
# 备注: mysql -h目标主机 -u用户名 -p密码
mysql -h192.168.101.123 -utest -p123456

备注:这里要补充一下,Kali Linux 默认使用的数据库客户端工具是基于 MariaDB 实现的。当你使用 mysql 命令行客户端连接到远程 MySQL 服务器时,客户端可能会显示自身的信息,也就是 MariaDB,但实际上连接的仍然是远程的 MySQL 服务器。可以使用 select version(); 查询数据库版本。

bash 复制代码
# 查询数据库的版本
select version();

这里可以看到连接的数据库版本是 8.0.42,说明连接的MySQL数据库确实符合上面MySQL数据库安装的版本。


相关推荐
大树884 小时前
金刚石散热越强,管路越先见顶
大数据·运维·服务器·人工智能·ai
摇滚侠4 小时前
Linux CentOS7 rpm 安装 MySQL 5.7
linux·运维·mysql
霸道流氓气质5 小时前
领域驱动设计(DDD)在 Spring Boot 微服务中的实践指南
运维·spring boot·微服务
bush45 小时前
嵌入式linux学习记录十四、术语
linux·嵌入式
载数而行5205 小时前
Linux 11 动态监控指令top
linux
Inhand陈工6 小时前
基于台达PLC与映翰通IG502的智慧水产养殖精准投喂与远程运维解决方案
运维·人工智能·物联网·阿里云·信息与通信
酣大智6 小时前
ARP代理--工作原理
运维·网络·arp·arp代理
麦聪聊数据6 小时前
数据服务化时代:企业数据能力输出的核心路径
数据库
不会C语言的男孩6 小时前
Linux 系统编程 · 第 8 章:进程基础
linux·c语言
ApacheSeaTunnel6 小时前
实战演示 | 基于 Apache SeaTunnel 与 Apache DolphinScheduler 实现 MySQL 到 Doris 离线定时增量同步
大数据·mysql·开源·doris·数据集成·seatunnel·数据同步